显式使用“new EventHandler”声明有什么好处?

时间:2013-07-03 12:42:18

标签: c# .net

例如,在将事件处理程序分配给上下文MenuItem之类的时候,有两种可接受的语法:

MenuItem item = new MenuItem("Open Image", btnOpenImage_Click);

...和...

MenuItem item = new MenuItem("Open Image", new EventHandler(btnOpenImage_Click));

我也注意到同样适用于此:

listView.ItemClick += listView_ItemClick;

...和...

listView.ItemClick += new ItemClickEventHandler(listView_ItemClick);

第二个(显式)对第一个有特别的优势吗?或者这更像是一个风格问题?

4 个答案:

答案 0 :(得分:9)

它是旧版C#编译器的语法(< = 1.1)。不再需要了。目前的编译器非常复杂,可以做到正确。

有时会有一点(小)的好处。如果您通过“+ =”分配事件处理程序,Intellisense自动完成功能可能会使代码编写速度更快。

答案 1 :(得分:9)

在C#1.0中,您别无选择,只能明确定义委托类型和目标。

从C#2.0开始,编译器允许您通过从方法组到兼容委托类型的隐式转换以更简洁的方式表达自己。这真的只是语法糖。

如果由于歧义而无法从方法组中解析出正确的重载,则有时您无法选择使用冗长的语法。

答案 2 :(得分:7)

唯一的时间是有用的,如果它不明确 - 例如,如果它是MenuItem(string, Delegate) - 如果有多个同等匹配符合签名的重载。这还包括var语法(如下所示)和泛型类型推断(未显示):

EventHandler handler = SomeMethod; // fine
EventHandler handler = new EventHandler(SomeMethod); // fine
var handler = new EventHandler(SomeMethod); // fine
var handler = (EventHandler)SomeMethod; // fine
var handler = SomeMethod; // not fine

在所有其他情况下,它是多余的,在2.0以后的任何编译器中都是不必要的。

答案 3 :(得分:5)

与您的编辑相关 - 使用new或不使用listView.ItemClick -= listView_ItemClick; 并未真正影响处理程序的添加,但删除处理程序与此类

略有不同
listView.ItemClick -= new ItemClickEventHandler(listView_ItemClick);

new

虽然不太可能影响大多数情景。第一个版本没有new关键字,据说效率更高。

this post中有详细说明,但结论是

  

所以两者都有效,但我们应该使用哪一部?如果事件是   在典型的开头/结尾订阅/取消订阅一次   WinForm应用程序然后它几乎不重要。但是,如果这样做   多次,然后第二种方法是优选的,因为它做得少   昂贵的堆分配,并将更快地工作

(该帖子中的第二种方法是没有{{1}}关键字的方法)

我说这对我来说似乎是一种微观优化,因此在大多数情况下它不太可能成为瓶颈。