什么';s隐式注册事件处理程序的好处

本文关键字:程序 事件处理 注册 什么 | 更新日期: 2023-09-27 18:30:01

将事件注册为有什么好处

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

更新:取消订阅怎么样?

什么';s隐式注册事件处理程序的好处

好处是您不必在类中列出名称和位置。

对于与注册事件的代码紧密耦合的轻函数,短版本更方便。

请注意,您也可以将delegate交换为=>

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

您可以更加简洁:

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

从语法上讲,它更干净(只要它不会导致长代码块,最好将其分解为命名方法)。

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

发件人:What are';闭包';在.NET中?

本质上,闭包是一个代码块,可以在后来,但它保持了最初的环境已创建-即它仍然可以使用该方法的局部变量等即使在该方法完成执行之后。

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

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

这只是关于编码风格。

值得注意的是,像第一种情况一样声明它可以避免"意大利面条代码",并以更自然(人类可读的方式)将局部变量(如果需要)注入到处理程序函数中。

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

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

在事件处理程序内部,您可以访问为处理程序方法的作用域实际声明的局部变量。对大多数人来说,这似乎是"自然的",但如果你像开发人员一样思考,那就不可能了。

祝你好运。