理解C 理解错了
创始人
2024-04-13 11:51:39
0

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

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

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

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

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

这个跟上面两种写法也是一样的效果,初次接触的时候,可能大家跟我一样会有些迷茫,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表达式的。这对程序员来说无疑又是提高生产力的一个体现!

 

【编辑推荐】

  1. Lambda表达式入门实例
  2. 在C++中使用Lambda函数提高代码性能
  3. 浅谈如何使用Lambda表达式做抽象代表
  4. LINQ中的Lambda表达式
  5. LINQ中的Lambda表达式2

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...