.net委托(转载)

一、什么是委托?

 委托就是定义一个 对于方法的引用,类似于c++中的函数指针。委托是用来将方法作为参数 传递进入其它方法的,

委托的格式?
 修饰符1 delegate  修饰符2  委托类型名(变量n);
 

 修饰符1 为定义的委托的范围修饰符,常用public;
 修饰符2为 返回值类型修饰符,如 :  void ,string ,char等;
 名字 为我们定义一个委托类型时所为它取得名字;

 对于 变量n  我们常常会有疑惑,委托是一个 方法吗?  为什么会有返回值 以及变量呢 ?
其实,委托并不是一个方法 ,而是一个 类型,它之所以有返回值以及变量是为了 保持 与其委托的方法 保持一致;

注意 : 委托是一个 类型  所以我们常常把它定义在一个 类的外面;
 还有 ,委托类型定义之后,我们还不能直接拿过来使用,还需要对它定义该类型的 委托变量;

格式 :
修饰符1 delegate  修饰符2  委托类型名(变量n);
委托类型名   委托变量;


使用时,还需要注意,我们在使用时要使用定义的委托变量,而不是定义的委托类型名,这类似于我们定义枚举型一样; 因为定义的委托变量是一个变量,所以 在使用之前我们还要对其进行赋值。

格式: 修饰符1 delegate  修饰符2  委托类型名(变量n);
           委托类型名   委托变量;
           委托变量=委托方法名;

注意: 这里的委托方法名就是你要委托的方法的名字,而且注意,不要加上了方法的参数以及括号,同时 ,这里委托的方法 还要与 该委托类型定义时所 定义的  返回值类型、参数列表类型以及参数个数  保持一致;  

 我们要先定义一个 方法;
   范围修饰符  【static】 返回值类型修饰符    调用方法名( 变量n, 委托类型  委托变量)
{
      委托变量(变量n);
         .
         .
         .
    委托变量(变量 n);
}
 
上边的变量n就是你所委托的方法的参数;

开始使用了 :
1)   委托类型  委托变量; 
2)   委托变量=委托方法名;
3)   调用方法名(变量n,委托变量);
完整示例如下:

 1 using System;
 2 
 3 using System.Collections.Generic;
 4 using System.Text;
 5  
 6 namespace  委托示例
 7 {
 8       public delegate  void del(string str);     //定义的委托类型
 9       calss  示例
10       {
11        static void send(string i)     //要委托的方法
12        {
13        console.WriteLine(i);
14        }
15  
16        static  void sendup(string list,del  handler)  //调用方法
17        {
18          handler(list);
19        }
20  
21        public  static  void  mian(string [] args)    //主方法
22       {
23            del  委托变量=send;   // 该句相当于:  del 委托变量; 委托变量=send;
24            sendup("这是一个 委托的示例!!!",委托变量);
25            console.ReadKey();
26           }
27  
28        }
29 }

二、Action与Func

Action委托:封装一个方法,该方法具有参数(0到16个参数)并且不返回值

Func<T,TResult>委托:封装一个方法,该方法具有参数(0到16个)和一个返回值

实例:

 1 public class DeleDemo
 2     {
 3         /// <summary>
 4         /// 有一个参数但没有返回值
 5         /// </summary>
 6         /// <param name="str"></param>
 7         public static void Say(string str)
 8         {
 9             Console.WriteLine(str);
10         }
11         /// <summary>
12         /// 有两个参数,有一个返回值
13         /// </summary>
14         /// <param name="a"></param>
15         /// <param name="b"></param>
16         /// <returns></returns>
17         public static int Add(int a, int b)
18         {
19             return a + b;
20         }
21         Action<string> action = new Action<string>(Say);     
22         Func<int, int, int> func = new Func<int, int, int>(Add);
23 
24         /// <summary>
25         /// 将委托作为参数传给方法
26         /// </summary>
27         /// <param name="action"></param>
28         /// <param name="func"></param>
29         public void Test(Action<string> action,Func<int,int,int> func)
30         {
31             action("Hello");
32             Console.WriteLine(func(1, 2));
33         }
34 
35         /// <summary>
36         /// 主函数
37         /// </summary>
38         public void Main()
39         {
40             Test(action, func);  //调用Test方法
41         }
42     }    

三、Predicate

是返回bool型的泛型委托,Predicate有且只有一个参数,返回值固定为bool。表示定义一组条件并确定指定对象是否符合这些条件的方法。此方法常在集合(Array 和 List<T>)的查找中被用到,如:数组,正则拼配的结果集中被用到。

 1 public class PredicateDemo
 2     {
 3         public int[] myNum = new int[8] { 12, 33, 89, 21, 15, 29, 40, 52 }; //定义一个数据
 4         public int[] myResult; //返回结果
 5 
 6         //定义一个方法,只有一个参数且返回bool类型,判断是否是偶数
 7         public static bool IsEven(int num)
 8         {
 9             if (num % 2 == 0)
10             {
11                 return true;
12             }
13             else
14             {
15                 return false;
16             }
17         }
18         Predicate<int> predicate = new Predicate<int>(IsEven);
19         
20         /// <summary>
21         /// 主程序
22         /// </summary>
23         private void Main()
24         {
25             //bool res = predicate(23);
26             myResult = Array.FindAll<int>(myNum, predicate);    //调用      
27         }
28     }

总结:

原文地址:https://www.cnblogs.com/panbin/p/5150255.html