理解C#中的Lambda表达式

先来看两段C#代码,来比较Lambda表达式:

在白沙黎族等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都做网站 网站设计制作定制网站,公司网站建设,企业网站建设,品牌网站设计,全网整合营销推广,外贸网站制作,白沙黎族网站建设费用合理。

 
 
 
  1. Thread t = new Thread(() => 
  2. AddIt AddDelegate = new AddIt(AddItem); 
  3. this.Invoke(AddDelegate); 
  4. }); 
  5. Thread t3 = new Thread(new ThreadStart(() => 
  6. AddIt AddDelegate = new AddIt(AddItem); 
  7. this.Invoke(AddDelegate); 
  8. })); 

这两种写法都是可以的,出来的IL也一样,但是意义是不同的,后者相当于匿名方法,前者

更像是"匿名"的委托,其实这样写:

 
 
 
  1. Thread t2 = new Thread(() => 
  2. this.Invoke(new AddIt(() => { this.listBox1.Items.Add("bbb"); })); 
  3. }); 

这个跟上面两种写法也是一样的效果,初次接触的时候,可能大家跟我一样会有些迷茫,Lamdba表达式到底该怎么用呢?

首先还是要弄清Lamdba表达式的几个特性:

1. Lamdba 表达式是一个委托类型:

 
 
 
  1. MethodInvoker invoker = () => { Console.WriteLine(); };
  2. //is actually equal to the following form.
  3.   MethodInvoker invoker = delegate() { Console.WriteLine(); };
  4. //这里是Lamdba 表达式的匿名委托的用法

2. Lamdba 表达式可以用作匿名方法

 
 
 
  1. MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); }); 
  2. //相当于:
  3.   MethodInvoker invoker = new MethodInvoker(MyFunc);
  4.   partial void MyFunc()
  5.   {
  6.     Console.WriteLine();
  7.   }

我们知道, 当构造一个新的委托的时候, 他的构造器需要一个函数指针作参数,这个函数指针是委托类型的

实际上,当我们这样去new 一个委托的时候:

MethodInvoker invoker = new MethodInvoker(MyFunc);

"MyFunc" 就是一个委托,而不只是一个函数名的存在. 编译器将为这个构造函数生成一个匿名委托:

MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });

可以这样理解编译器的行为: 匿名方法其实也就是委托。

那么为什么我们可以这么写呢:

MethodInvoker invoker = () => { Console.WriteLine(); };

我们来看一看:

首先,这个委托的构造器需要一个委托参数,所以通常我们得这样写:

MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });

但是匿名的delegate 可以转化成函数指针 (void() target):

所以这样写是可以的:

 
 
 
  1. MethodInvoker invoker = new MethodInvoker(MyFunc);
  2. //而匿名的委托又可以描述为Lambda表达式
  3.   MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
  4. //另外一方面,由于编译器对"宽松委托"的支持, MethodInvoker类委托可以转化成匿名类委托:
  5.   MethodInvoker invoker = delegate() { Console.WriteLine(); };
  6. //而匿名的委托又可以用Lambda表达式来描述
  7.   MethodInvoker invoker = () => { Console.WriteLine(); };

从上面,我们可以看到一个复杂的委托是如何转化成简洁的Lambda表达式的。这对程序员来说无疑又是提高生产力的一个体现!

当前标题:理解C#中的Lambda表达式
当前链接:http://www.shufengxianlan.com/qtweb/news27/400127.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联