新建一个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表达式,一脉相承.讲完了.