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

更新: 那退订呢?

4

4 回答 4

3

好处是您不必在课堂上想出名字和位置。

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

请注意,您也可以delegate兑换=>

button1.Click += (object sender, EventArgs e) =>   
{
    ..
}
于 2012-04-04T06:42:15.080 回答
3

你可以更简洁:

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

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

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

来自:.NET 中的“闭包”是什么?

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

另见:http ://cshapindepth.com/articles/chapter5/closures.aspx

于 2012-04-04T06:42:27.720 回答
2

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

于 2012-04-04T06:45:17.573 回答
1

这只是关于编码风格。

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

要更清楚。通过像第一种情况一样编写,您可以:

int x = 0; 

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

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

祝你好运。

于 2012-04-04T06:42:13.410 回答