1、在我们程序中,经常有这样一些需求:1. 需要一个临时方法,这个方法只会使用一次,或者使用的很少。2. 这个方法的方法体很短,以至于比方法声明都短,写起来实在没劲(我将其称之为“ 一句话方法”) 。没办法,这样的方法写起来真是吃力不讨好,比如一些按钮事件处理中,有些按钮点击就是弹出一个对话框,或者调用一下别的什么方法。比如下面的代码:this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);private void btnRefresh_Click(object sender, EventArgs e)Bind
2、Data();这个”Refresh”按钮就是做一下调用一下 BindData()数据绑定的方法,为此我们不得不写一个新方法。好了,C# 2.0 为我们提供了匿名方法 :this.btnRefresh.Click += delegate(object sender, EventArgs e) BindData(); ;没劲的代码没了。想知道这种写法的幕后黑手么?其实编译器还是在我们的后面干了一件龌龊的事情:它为我们产生了一个新的方法,它只是表面上为我们节省了代码。Private voidb_0(object sender, EventArgs e)this.BindData();看看这个编译器产
3、生的方法的名称:b_0,Test 是这个匿名方法所放置的地方( 因为这个按钮的时间我是放在一个 Test 方法里的)还有一点需要注意的是,如果这个匿名方法是在实例方法里使用,那么编译器为我们生成的幕后方法也是实例方法,否则就是静态方法了.是不是觉得匿名方法这东西很不错,减少了很多代码阿,但是匿名方法的使用还并不人性化,什么是人性化呢?比如你可以用自然的语言将程序代码读出来,这样才算人性化了.在.net 2.0 中 System.Collections.Generic 命名空间下 List里有一些新增的方法。比如 Find,如果使用匿名方法我们如何调用呢:books.Find(delegate(
4、Book book)return book.Price book.Price x+1 deleage(int x)return x+1;/后面跟着的是语句块x=return x+1; delegate(int x)return x+1;/输入参数也可以带类型,带类型后别忘记小括号哦(int x) = x+1 delegate(int x)return x+1;/也可以多个输入参数,逗号分隔,别忘记小括号(x,y) = x+y delegate(int x,int y)return x+y;/无参的也行() = 1delegate()return 1;对于 Lambda 表达式来说她的用法就是如此,但是在 Lambda 背后却有很多的故事和玄机。用 Lambda 表达式可以构建表达式树,而表达式树对于 Linq 来说就像树根对于树一样重要。在这里就不讨论表达式树的问题了,这个东西也不是三言两语能够说清楚的,等待时机成熟的时候我们再来进一步讨论。public delegate bool Predicate(T obj);