隐式注册事件处理程序有什么好处

时间:2012-04-04 06:35:40

标签: c#

注册活动有什么好处:

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)
{
    ..
}

更新 那取消订阅呢?

4 个答案:

答案 0 :(得分:3)

你可以更简洁:

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

从语法上来说它更干净(只要它不会导致长代码块更好地分解为命名方法)。

内联声明是一个闭包,它允许您访问匿名方法旁边的变量。

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

  

本质上,闭包是一个可以在a处执行的代码块   以后的时间,但它保持了它的第一个环境   创建 - 即它仍然可以使用方法的局部变量等   即使在该方法完成执行后,也会创建它。

另请参阅:http://csharpindepth.com/articles/chapter5/closures.aspx

答案 1 :(得分:2)

好处是您不必在课堂上提出姓名和地点。

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

请注意,您还可以与delegate

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

答案 2 :(得分:2)

使用匿名委托或lambda注册事件处理程序时,可以编写更短的代码并使用闭包。 您无法取消订阅该事件,如果事件处理程序代码太长,您的代码就会变得难看。

答案 3 :(得分:1)

这只是编码风格。

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

更清楚。通过像第一种情况一样写作,你可以:

int x = 0; 

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

在事件处理程序中,您可以访问为处理程序方法范围实际声明的局部变量。对于大多数人来说,这似乎是“自然的”,但如果你像开发人员一样思考它甚至不可能。

祝你好运。