C#:委托

Delegate使用三步骤:

1. 声明:   

public delegate void ShowDelegate1();  //无参无返回值
public delegate int ShowDelegate2(int a, int b);  //有参有返回值
public delegate T ShowDelegate<T>(T t);  //泛型

2. 赋值:

ShowDelegate1 myDelegate1 = Fun1;
//可以重新赋值,但必须是匹配的类型
myDelegate1 = Test;
//对于有参的情况,注意赋值只赋函数名,调用时才传参
ShowDelegate2 myDelegate2 = Fun2;
ShowDelegate<string> myDelegate3 = Fun3;
ShowDelegate<float> myDelegate4 = Fun4;

3. 调用:

myDelegate1();
int sum = myDelegate2(1,2);
myDelegate3("HelloWorld!");
myDelegate4(1.5f);
 1     private void Fun1()
 2     {
 3         Debug.Log("Fun()");
 4     }
 5  
 6     void Test()
 7     {
 8         Debug.Log("Test");
 9     }
10 
11     private int Fun2(int a,int b)
12     {
13         Debug.Log("int Fun2(int a,int b)");
14         return a + b;
15     }
16 
17     private string Fun3(string s)
18     {
19         Debug.Log(s);
20         return s;
21     }
22 
23     private float Fun4(float f)
24     {
25         Debug.Log(f);
26         return f;
27     }
  • 委托是引用类型,调用之前要赋值,否则为NULL。

.Net内置委托:特点:不用显示的声明,可以直接赋值 (因为在System里已经声明过了)

1. Action:

  使用范围:0-16个参数,无返回值的委托。

2. Func:

  使用范围:0-16个参数,必须有返回值的委托。
 1 //注意最后一个参数代表返回值类型,如果只有一个参数表示无参有1个该类返回值。
 2 Func<int,int,bool> f1 = Fun5;
 3 private bool Fun5(int a,int b)
 4 {
 5      if (a > b)
 6         return true;
 7     else
 8         return false;
 9 } 

匿名方法:

  定义:没有名字的方法。 
  使用范围:函数回调、和委托结合。
1 Action ac1 = delegate ()
2 {
3     Debug.Log("匿名方法");
4 };  //注意匿名方法后有分号
5 ac1();

Event事件:

  使用范围:只能用+=、-=添加和撤销事件,且只能在声明自己的类里赋值和调用。       
 1 public class MyClass
 2 {
 3     public event Action action;
 4     public void Function()
 5     {
 6         action += delegate ()
 7         {
 8             Debug.Log("event");
 9         };
10         action();
11     }
12 }

多播委托:

  定义:一个委托中注册多个方法,可以用+、-运算符添加或撤销方法。
 1 Action ac1 = delegate ()
 2 {
 3     Debug.Log("匿名方法");
 4 };  //注意匿名方法后有分号
 5 ac1 += delegate ()
 6 {
 7     Debug.Log("多播委托");
 8 };
 9 ac1 += Fun1;
10 ac1 -= Fun1;
11 if (ac1 != null)  //多播委托可能会撤销到一个方法也没有了,注意判空
12     ac1();
原文地址:https://www.cnblogs.com/tomatokely/p/15761903.html