.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、委托可以实现异步执行(这是普通方法所不具备的)。

事件

 

 

匿名方法,

Lambda

posted on 2021-04-18 23:51  john_yong  阅读(65)  评论(0编辑  收藏  举报

导航