源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

理解C#中的Lambda表达式

  • 时间:2021-03-23 14:57 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:理解C#中的Lambda表达式
先来看两段代码:
[u]复制代码[/u] 代码如下:
 Thread t = new Thread(() => { AddIt AddDelegate = new AddIt(AddItem); this.Invoke(AddDelegate); }); Thread t3 = new Thread(new ThreadStart(() => { AddIt AddDelegate = new AddIt(AddItem); this.Invoke(AddDelegate); }));
  这两种写法都是可以的,出来的IL也一样,但是意义是不同的,后者相当于匿名方法,前者 更像是"匿名"的委托,其实这样写:
[u]复制代码[/u] 代码如下:
Thread t2 = new Thread(() => { this.Invoke(new AddIt(() => { this.listBox1.Items.Add("bbb"); })); });
这个跟上面两种写法也是一样的效果,初次接触的时候,可能大家跟我一样会有些迷茫,Lamdba表达式到底该怎么用呢? 首先还是要弄清Lamdba表达式的几个特性: [b]1. Lamdba 表达式是一个委托类型: [/b]
[u]复制代码[/u] 代码如下:
  MethodInvoker invoker = () => { Console.WriteLine(); }; //is actually equal to the following form.   MethodInvoker invoker = delegate() { Console.WriteLine(); }; //这里是Lamdba 表达式的匿名委托的用法
[b]2. Lamdba 表达式可以用作匿名方法 [/b]
[u]复制代码[/u] 代码如下:
  MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); }); //相当于:   MethodInvoker invoker = new MethodInvoker(MyFunc);   partial void MyFunc()   {     Console.WriteLine();   }  
我们知道, 当构造一个新的委托的时候, 他的构造器需要一个函数指针作参数,这个函数指针是委托类型的 实际上,当我们这样去new 一个委托的时候:
[u]复制代码[/u] 代码如下:
  MethodInvoker invoker = new MethodInvoker(MyFunc);  
"MyFunc" 就是一个委托,而不只是一个函数名的存在. 编译器将为这个构造函数生成一个匿名委托:
[u]复制代码[/u] 代码如下:
  MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });  
可以这样理解编译器的行为: 匿名方法其实也就是委托。 那么为什么我们可以这么写呢:
[u]复制代码[/u] 代码如下:
  MethodInvoker invoker = () => { Console.WriteLine(); };  
我们来看一看: 首先,这个委托的构造器需要一个委托参数,所以通常我们得这样写:
[u]复制代码[/u] 代码如下:
  MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });
但是匿名的delegate 可以转化成函数指针 (void() target):  所以这样写是可以的:
[u]复制代码[/u] 代码如下:
 MethodInvoker invoker = new MethodInvoker(MyFunc); //而匿名的委托又可以描述为Lambda表达式   MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
//另外一方面,由于编译器对"宽松委托"的支持, MethodInvoker类委托可以转化成匿名类委托:
[u]复制代码[/u] 代码如下:
  MethodInvoker invoker = delegate() { Console.WriteLine(); }; //而匿名的委托又可以用Lambda表达式来描述   MethodInvoker invoker = () => { Console.WriteLine(); };
从上面,我们可以看到一个复杂的委托是如何转化成简洁的Lambda表达式的。这对程序员来说无疑又是提高生产力的一个体现!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部