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();