C# 3.0特性 - 匿名方法和Lambda表达式2010-12-03 博客园 横刀天笑在我们程序中,经常有这样一些需求:1. 需要一个临时方法,这个方法只会使用一次,或者使用的很少。2. 这个方法的方法体很短,以至于比方法声明都短,写起来实在没劲(我将 其称之为“一句话方法”)。没办法,这样的方法写起来真是吃力不讨好,比如一些按钮事件处理中,有 些按钮点击就是弹出一个对话框,或者调用一下别的什么方法。比如下面的代码 :
this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
private void btnRefresh_Click(object sender, EventArgs e)
{
BindData();
}
这个”Refresh”按钮就是做一下调用一下BindData()数据绑定的 方法,为此我们不得不写一个新方法。好了,C# 2.0为我们提供了匿名方法:this.btnRefresh.Click += delegate(object sender, EventArgs e) { BindData(); };没劲的代码没了。想知道这种写法的幕后黑手么?其实编译器还是在我们的后面干了一件龌龊的事情:它为我们产生了一个新 的方法,它只是表面上为我们节省了代码。
private void b__0(object sender,EventArgs e)
{
this.BindData();
}
看看这个编译器产生的方法的名称:b_0,Test是这个匿名方法所放置的地方(因为这个按钮的时间我是放在一个 Test方法里的) 还有一点需要注意的是,如果这个匿名方法是在实例方法里使用, 那么编译器为我们生成的幕后方法也是实例方法,否则就是静态方法了。是不是觉得匿名方法这东西很不错,减少了很多代码阿,但是匿名方法的使用 还并不人性化,什么是人性化呢?比如你可以用自然的语言将程序代码读出来,这 样才算人性化了.在.net 2.0中System.Collections.Generic命名空间下List里 有一些新增的方法。比如Find,如果使用匿名方法我们如何调用呢:books.Find(delegate(Bookbook){return book.Price<50;});代码是很简单,但是却无法朗读出来,来看看Lambda表达式的写法:books.Find(book=>book.Price<50);这个Lambda表达式就可以这样阅 读出来了:给你一本书,如果它的价格小于50则返回true。好了,那我们就走进Lambda表达式吧: