2012-04-04 50 views
1

什么是注册一个事件作为的好处:什么是注册一个事件处理程序的好处隐含

void MyMethod() 
{ 
    button1.Click += delegate (object sender, EventArgs e) 
    { 
     .. 
    } 
} 

与比较:

void MyMethod() 
{ 
    button1.Click += new System.EventHandler(this.button1_Click); 
} 

void button1_Click(object sender, EventArgs e) 
{ 
    .. 
} 

UPDATE: 又是怎么回事取消订阅它?

回答

2

好处是你不必在课堂上想出一个名字和一个地方。

对于轻功能,紧密耦合到注册事件的代码,短版本更方便。

请注意,您也可以为=>

button1.Click += (object sender, EventArgs e) => 
{ 
    .. 
} 
+0

那么取消注册呢? – Mimi 2012-04-04 06:48:35

+1

如果你需要取消注册(大多数处理程序不需要),那么这是使用命名方法的一个很好的理由。 – 2012-04-04 06:51:29

+0

我找到了[这里](http://stackoverflow.com/q/183367/668342);) – Mimi 2012-04-08 05:16:47

1

这只是编码风格。

值得注意的是,在第一种情况下声明它可以让您避免“意大利面代码”并以更自然(人类可读的方式)注入处理函数局部变量(如果需要)。

要更清楚。在你可以先写的情况下,如:

int x = 0; 

System.Windows.Forms.Button button = new System.Windows.Forms.Button(); 
button.Click += (o,e)=> { 
++x; 
}; 

里面的事件处理程序可以访问声明实际上出于对处理方法的范围局部变量。对大多数人来说,这似乎是“自然的”,但如果你像一个开发人员那样思考,就不应该这样做。

祝你好运。

3

交换delegate你可以更简洁:

button1.Click += (sender, e) => 
{ 
}; 

在语法上是清洁的(只要它不会导致长块的代码将更好地分解成命名方法)。

内联声明是一个闭包,它使您可以访问与匿名方法相邻的变量。

来自:What are 'closures' in .NET?

在本质上,一个封闭件是可在一个 稍后的时间被执行的代码的块,但其保持在其被第一环境 创建 - 即它可以仍使用创建它的方法 的局部变量等,即使在该方法执行完毕后。

参见:http://csharpindepth.com/articles/chapter5/closures.aspx

+0

+1感谢您的提示。 – Mimi 2012-04-08 05:18:32

2

注册时使用匿名委托或lambda事件处理程序,你可以写短代码,并使用闭。 但是您不能取消订阅该事件,并且如果事件处理程序代码太长,则您的代码变得很难看。

相关问题