什么';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)
{
..
}
更新:取消订阅怎么样?
好处是您不必在类中列出名称和位置。
对于与注册事件的代码紧密耦合的轻函数,短版本更方便。
请注意,您也可以将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;
};
在事件处理程序内部,您可以访问为处理程序方法的作用域实际声明的局部变量。对大多数人来说,这似乎是"自然的",但如果你像开发人员一样思考,那就不可能了。
祝你好运。