.net基础---委托,事件,匿名方法,Lambda
委托
什么是委托
委托是实现类似函数指针的功能,即指向函数(可以是静态函数,也可以是实例函数,编码过程中一般都是实例函数)的引用对象。在C++编程中经常会用到函数指针,在C#中则是委托的概念,弱化了指针概念。与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象,CLR能够保证delegate指向一个有效的方法,无须担心delegate会指向无效地址或者越界地址。
委托使用delegate关键字进行定义,一般定义于与类同级的代码块中,委托可以是不属于类成员的的(当然也可以定义类内部)。示例
public delegate bool CheckHandler(double srcValue, double destValue);
为什么使用委托
1、委托是函数的引用,这使得我们可以将参数一致,返回值一致的函数当成参数,变量进行传递,从而提升代码的重用性,提高代码可读性(减少分支判断)。
可以参考下面代码(实现了类似linq查询,其实linq本身就是通过func、表达式实现的)
1 public void Test() 2 { 3 var values = new List<double>() { 90, 8, 99, 2, 50, 60, 90.8, 87, 100, 22, 87.3 }; 4 var values1 = CustomerFindAll(values,50,CheckLarge); 5 Console.WriteLine("large---------"); 6 foreach (var item in values1) 7 { 8 Console.WriteLine(item); 9 } 10 Console.WriteLine("little and equal--------"); 11 var values2 = CustomerFindAll(values, 50, CheckLittleAndEqual); 12 foreach (var val in values2) 13 { 14 Console.WriteLine(val); 15 } 16 17 } 18 public List<double> CustomerFindAll(List<double> values,double checkValue,CheckHandler check) 19 { 20 var result = new List<double>(); 21 foreach (var item in values) 22 { 23 if (check(item, checkValue)) 24 { 25 result.Add(item); 26 } 27 } 28 return result; 29 } 30 31 public bool CheckLittle(double srcValue, double destValue) 32 { 33 return srcValue < destValue; 34 } 35 public bool CheckLittleAndEqual(double srcValue, double destValue) 36 { 37 return srcValue <= destValue; 38 } 39 public bool CheckEqual(double srcValue, double destValue) 40 { 41 return srcValue == destValue; 42 } 43 public bool CheckLarge(double srcValue, double destValue) 44 { 45 return srcValue > destValue; 46 } 47 public bool CheckLargeAndEquel(double srcValue, double destValue) 48 { 49 return srcValue >= destValue; 50 }
2、委托可以挂载多个方法,构成委托链,实现消息通知的功能(简化代码)。
3、委托可以实现异步执行(这是普通方法所不具备的)。
事件