注册活动有什么好处:
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)
{
..
}
更新 那取消订阅呢?
答案 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;
};
在事件处理程序中,您可以访问为处理程序方法范围实际声明的局部变量。对于大多数人来说,这似乎是“自然的”,但如果你像开发人员一样思考它甚至不可能。
祝你好运。