当前位置: 首页 > 编程语言 > C# > 正文

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表达式吧: