从委托而起(一)委托、匿名方法和Lambda表达式,一脉相承

新建一个winform应用程序在Form1中拖入一个按钮双击产生一个Click事件在事件中添加这句代码 

MessageBox.Show("hello");

F5调试运行.事件的演示OK

下面就来讨论下这个"事件"在Form1.cs节点中打开Form1.Designer.cs,展开"Windows窗体设计器生成代码节点",找到

this.button1.Click += new System.EventHandler(this.button1_Click);

简单的分析下,在this也就是这个窗体下的button1按钮的Click事件中增加一个EventHandler事件处理机制,他的处理者是方法button1_Click.

在EventHandler处点击F12转到定义发现EventHandler其实是一个委托

public delegate void EventHandler(object sender, EventArgs e);

那么我们就根据他委托的性质改写下他的代码:改写后如下: this.button1.Click += this.button1_Click;果断F5下吧,代码正常运行了,果真能简写,这是在我们意料之中的事.

简单的说下委托吧,

public delegate void EventHandler(object sender, EventArgs e);

,delegate是委托的修饰符,public修饰委托为公共的,void是他的返回值,看起来和方法很像但是委托并不等同与方法,而是一个引用类型.是C#中的安全指针.

和委托关联的方法必须具有与其完全相同的返回值类型和参数列表,看看双击生成的button1_Click方法对吧一样对吧.这点很关键.

好了现在再修改一下这个Cilk事件,在+=后面声明一个匿名委托,代码如下:

this.button1.Click +=delegate(object sender, EventArgs e)

{MessageBox.Show("hello");};

(这里EventArgs,MessageBox需要Ctrl+.解析一下 )

OK这样可以把Form1.cs中的button1_Click这个方法删掉了,他已经被我们抛弃了.F5运行验证你的程序吧.运行OK继续下面的修改(前提.net3.5及其以上版本),代码如下:

this.button1.Click +=(sender,e)=>MessageBox.Show("hello");

运行通过.

委托、匿名方法和Lambda表达式,一脉相承.讲完了.

posted @ 2011-08-18 12:58  刘凯威  阅读(319)  评论(0编辑  收藏  举报