一、什么是委托?
委托就是定义一个 对于方法的引用,类似于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 }
总结: