首页 > 代码库 > .Net进阶系列(8)-委托和事件(二)

.Net进阶系列(8)-委托和事件(二)

一. 泛型委托

  所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托。

  将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下。

 1  public class Calculator2
 2     {
 3         //传统解决方案一:在该类中声明多个方法,分别是加倍、平方、立方的方法
 4 
 5 
 6         //传统解决方案二:在该类中声明一个万能方法,通过传递不同的参数类型来区分是执行加倍还是平方或者立方操作
 7 
 8 
 9         //解决方案三:声明一个万能方法,传递一个委托进来,相当于传递了一个业务逻辑进行,在该方法里只需要执行即可
10         /// <summary>
11         /// 万能方法
12         /// </summary>
13         /// <param name="arrs">int类型的数组 </param>
14         /// <param name="mydel">自定义委托</param>
15         public delegate T myDel<T>(T t);
16         public static void MySpecMethord<T>(T[] arrs, myDel<T> myDel)
17         {
18             for (int i = 0; i < arrs.Length; i++)
19             {
20                 arrs[i] = myDel(arrs[i]);
21                 //arrs[i] = mydel.Invoke(arrs[i]);  //等价于上面那句
22                 Console.WriteLine(arrs[i]);
23             }
24         }
25 
26     }

二. 内置委托

  .Net FrameWork提供两个支持泛型的内置委托,分别是Action和Func,结合lambda表达式,可以提高开发效率

  二者的区别:

  1.Action只能委托无返回值的方法,支持16个重载(in代表输入参数,该重载没有返回值)

  分别是:

    * public delegate void Action<in T>(T obj);

    * public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

    * ......

    * public delegate void Action<in T1, in T2,......,in T16>(T1 arg1, T2 arg2,......,T16 arg16);

    *

  2.Func必须委托有返回值的方法,支持17个重载(注意括号里最后一个代表返回值,in代表输入参数,out代表返回值)

  分别是:

    * public delegate TResult Func<out TResult>();

    * public delegate TResult Func<in T, out TResult>(T arg);

    * public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

    * ......

    * public delegate TResult Func<in T1, in T2,.......in T16 out TResult>(T1 arg1, T2 arg2,......T16 arg16);

    *

  总结:除了ref参数和out参数,内置委托基本上能适用于任何泛型委托的场景,非常好用

    3. 内置委托和自定义委托的区别:

  自定义委托需要先声明一下,让系统认识这个自定义委托,然后才能实例化赋值方法;而内置委托系统本事就存在,所有不需要事先声明,直接实例化赋值方法即可

 

三. 委托的其它性质

 

 

四. 事件

 

.Net进阶系列(8)-委托和事件(二)