8

例如,在将事件处理程序分配给 context 之类的东西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

4 回答 4

9

它是旧版本 C# 编译器 (<=1.1) 的语法。不再需要了。当前的编译器足够复杂以使其正确。

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

于 2013-07-03T12:43:26.420 回答
9

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

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

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

于 2013-07-03T12:46:41.830 回答
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 以后的任何编译器中都是不必要的。

于 2013-07-03T12:50:00.530 回答
5

与您的编辑相关 - 添加处理程序并没有真正受到使用new或不使用的影响,但删除这样的处理程序略有不同

listView.ItemClick -= listView_ItemClick;

listView.ItemClick -= new ItemClickEventHandler(listView_ItemClick);

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

这篇文章中有详细的解释,但结论是

所以两者都有效,但我们应该使用哪一个?如果事件在开始/结束时被订阅/取消订阅一次,就像在典型的 WinForm 应用程序中一样,那么它几乎不重要。但是,如果多次这样做,则第二种方法更可取,因为它减少了昂贵的堆分配并且工作得更快

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

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

于 2013-07-03T12:50:08.000 回答