委托

一.委托的概念

       委托是一种在对象里保存方法的引用,也是一种类型安全的函指针。

   继承是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();

如有不足之处,希望大家帮忙指出,万分感谢。