理解Lambda表达式

  先来看两段代码:

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也一样,但是意义是不同的,后者相当于匿名方法,前者

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

Thread t2 = new Thread(() => 

this.Invoke(new AddIt(() => this.listBox1.Items.Add("bbb"); }
)); 
}
); 

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

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

1. Lamdba 表达式是一个委托类型:
  MethodInvoker invoker = () => { Console.WriteLine(); };
//is actually equal to the following form.

  MethodInvoker invoker = delegate() { Console.WriteLine(); };
//
这里是Lamdba 表达式的匿名委托的用法
 

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

  MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); }); 
//相当于:

  MethodInvoker invoker = new MethodInvoker(MyFunc);
  partial 
void
 MyFunc()
  
{
    Console.WriteLine();
  }

我们知道, 当构造一个新的委托的时候, 他的构造器需要一个函数指针作参数,这个函数指针是委托类型的
实际上,当我们这样去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):
 所以这样写是可以的:
 

 MethodInvoker invoker = new MethodInvoker(MyFunc);
//而匿名的委托又可以描述为Lambda表达式

  MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });
//另外一方面,由于编译器对"宽松委托"的支持, MethodInvoker类委托可以转化成匿名类委托:

  MethodInvoker invoker = delegate() { Console.WriteLine(); };
//而匿名的委托又可以用Lambda表达式来描述

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

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

posted on 2007-09-26 13:42 Freesc Huang 阅读(1050) 评论(0) 编辑 收藏

<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

公告

These postings are provided "AS IS" with no warranties
and confer no rights.


Locations of visitors to this page

Blog Keywords
Embedded System,Visual Studio,.Net Framework,.Net Compact Framework,.Net Micro Framework,Windows Mobile,Windows Embedded CE,Emulator,WCF,CLR,Design & Pattern,C/C++,C#,Matlab,Algorithms
昵称:Freesc Huang
园龄:4年11个月
粉丝:32
关注:4

统计

  • 随笔 - 197
  • 文章 - 0
  • 评论 - 840

搜索

 

随笔分类(227)

随笔档案(197)

Blogs

Link

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜