事件处理程序的多个选项

时间:2014-02-18 10:37:22

标签: c# winforms

我正在使用带有Resharper的c#Win Forms,它为我提供了三个事件处理程序选项:

例如:

1。button.Click+= (sender, args) => ;

2。button.Click+= delegate(object sender, EventArgs args) { };

3。button3.Click+= Button3OnClick;

private void Button3OnClick(object sender, EventArgs eventArgs)
{

}

所以我的问题是:

  1. 使用其中一个与其他人有什么不同?
  2. 我应该坚持使用首选方法吗?
  3. 由于

3 个答案:

答案 0 :(得分:1)

每个人都会告诉你,他们是等同的。

要注意的一件重要事情

来自How to: Subscribe to and Unsubscribe from Events (C# Programming Guide)

  

重要的是要注意你不能轻易取消订阅   如果您使用匿名函数订阅它,则为event。至   在这种情况下取​​消订阅,有必要返回代码   在您订阅该事件的地方,将匿名方法存储在   委托变量,然后将委托添加到事件中。一般来说,   我们建议您不要使用匿名函数进行订阅   事件,如果您稍后将不得不取消订阅该事件   在你的代码中指出。

答案 1 :(得分:1)

  

3)button3.Click + = Button3OnClick;

在此处附加委托,该委托引用命名方法Button3OnClick

  

2)button.Click + = delegate(object sender,EventArgs args){};

这里您以.NET 1.1样式声明匿名方法。并附上引用这个匿名方法的delegate。编译器将为此匿名方法生成序数命名方法,因此与

相同
button.Click += CompilerGeneratedName;

其中

private void CompilerGeneratedName(object sender, EventArgs args)
{  
}

在.NET版本上> 3你不太可能会使用这种语法,因为它是用lambdas简化的。

  

1)button.Click + =(sender,args)=> ;

与之前的情况完全相同,但写在lambda syntax中。编译器将为此匿名方法生成命名方法。

所有这些选项都是相同的 - 它们创建并附加委托,这些委托使用必需的语法引用方法。唯一的区别是方法的名称 - 方法在编译之前或编译期间获取名称。

  

我应该坚持使用首选方式吗?

通常lambdas(即匿名方法)用于非常小的方法,这些方法不值得手动创建命名方法。但事件处理程序通常不那么简单。所以,我个人不喜欢让部分处理程序命名,并且部分附加就地,因为我喜欢以一致的方式保持代码。我还希望看到事件处理程序的用法,能够从事件中取消订阅处理程序,以及在堆栈中处理程序名称。所以我坚持使用命名处理程序。但是你总是应该像团队一样使用相同的指导。

答案 2 :(得分:0)

我建议您阅读活动和代表:Delegates and Events

但它归结为是选项3始终是在.net 2中创建事件的事实标准。自从.net 3代表介绍并使用简短的选项1和选项2更容易实现。

上面使用的委托指定包含签名和返回类型的占位符,委托内的代码描述了交互。

如果您了解事件,请使用选项3来了解事件。如果你认为你有代理人的话,请使用选项2.当它开始无聊你输入所有内容时使用选项1

:)