1定义:委托=函数指针
C# public delegate void Test(string str);
等价C++ public void (*Test)(string str);
委托赋值(初始化)和使用:
一个实体函数 :public void show(string str){//略}
Test t=new Test(show)或直接Test t=show
这样t就指向Test地址,执行t(“111”)就等于执行show(“111”)
委托的实现就在于将一个函数地址(名)给了委托变量。
2多播委托:
public void show1(string str){//略}
public void show2(string str){//略}
public void show3(string str){//略}
Test t=show1;t=show2;t=show3,执行t(“111”),则执行最后一次show3(“111”)
Test t=show1;t+=show2;t+=show3,执行t(“111”),则顺次执行一遍show1~3(“111”)
多播即将函数地址加载到委托列表里。(同理-=删除列表里存储的地址),执行委托的时候,就会顺次执行这些函数。
对于有返回值的多播委托,取最后一次返回值。
3委托数组:
Test[] t={show1,show2,show3};
定义了一个委托,可以把它当作数组来指向函数
4用自带的泛型委托来声明委托
Func<T>和Action<T>二者都可以接受最大参数个数为16个,二者的区别在于一个有返回值,另外一个返回值为void
比较一下,其实泛型委托和自定义的委托在使用上没什么不同。
只不过泛型委托Func<T> Action <T>系统已经为我们定义好了,直接使用就可以了。
为什么会有两个泛型委托,应该是为了解决泛型列表协变和抗变的问题,脑补吧
例子
泛型委托定义为 public deletegate TResult Func<in T,out TResult>(T arg)
Func<int , int> test <>里最后一个int是返回类型(必须有),前面的是形参类型表(可以没有)
泛型委托定义public deletegate Action<in T>(T arg)
Action<int> test <>里都是形参类型表(可以没有)
还有一个断言委托Predicate<T>,返回一个bool型,可自行研究。
5匿名方法
RT,即没有方法名称的方法
Test t=deletegate(string str ){//方法体};
可这样以将委托和委托实现合二为一,
还可以进一步压缩为lambda表示式:Test t=str=>{//方法体}