一.委托的概念
委托是一种在对象里保存方法的引用,也是一种类型安全的函指针。
继承是System.MulicastDelegate,任何委托都是多播委托。在IL层中,委托就是一个类。IL(中间语言,高级语言(如C#等)-----中间语言(IL)---计算机识别语言)
二委托语法
声明委托
public delegate void MethodDelegate;
实例委托
MethodDelegate method=new MethodDelegate(domethod);//此处把方法作为参数传入实例,注意不要加()
委托实例的调用
不带参数:
method.Invoke();//效果等同于 domethod(); 此处也可以省略Invoke直接method()个人习惯。
带参数
method.Invoke(string s1,string s2......);//此处必须和声明委托时所要求的参数个数、类型、顺序完全保持一致。
委托调用的几种方式
method.Invoke();
method.BeginInvoke();//用一个异步多线程完成计算
method();
为了保证规范性,微软提供了两种委托来满足所有的委托需求,Action和Func
Action
提供一个不带返回值的委托方法,可以接收0-16个泛型参数
语法:Action<string,string.....>
示例:
Action<string,string.....> action=new Action<string,string.....>(method);//注意这里的method方法的参数列表的个数、顺序、类型必须和委托是一致的
action.Invoke("参数的值1","参数的值2");
Func
提供一个带返回值的委托方法,可以接收0-16个泛型参数
语法Func<string,string>//这里需要注意,<>里最后一个类型表示返回值类型
示例
Func<string.......string>func=new Func<string.....string>(method);
string Result=func.Invoke();//这里可以像普通调用方法一样得到返回值
三。多播委托
所有的委托都继承自System.MulicatDelegate,而MulicatDelegate就是多播委托。
多播委托存在的意义:
一个委托实例包含多个方法,可以通过+=/-=添加/移除方法,Invoke时可以按顺序执行。+=按照从上至下的顺序,-=按照至下向上的顺序执行
语法:
Actiong<string>action=method;
action+=method1;
action+=method2;
..........................
action.Invoke();//
说明:通常情况我们不会使用Func来进行多播委托,原因:当有多个方法都具备返回值时,不能获取中间的返回值,只能获取最后一个方法的返回值。
多播委托在执行时出现未捕获的异常,方法链会直接结束。
多播委托不能直接使用BeginInvoke()方法来调用,因为多播委托不支持异步多线程。而如果在实际的应用场景中又有这样的需求,那么我们可以换一种思路。
可以通过遍历GetInvocationList()来循环使用BeginInvoke();
如有不足之处,希望大家帮忙指出,万分感谢。