显式使用“new EventHandler”声明有什么好处?
例如,在将事件处理程序分配给上下文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);
第二个(显式)对第一个有什么特别的优势吗? 或者这更像是一个风格问题?
在C#1.0中,您别无选择,只能明确定义委托类型和目标。
从C#2.0开始,编译器允许您通过从方法组到兼容委托类型的隐式转换以更简洁的方式表达自己。 这真的只是语法糖。
有时,如果由于模糊性无法从方法组中解析出正确的重载,则您别无选择,只能使用冗长的语法。
它是旧版C#编译器(<= 1.1)的语法。 不再需要了。 目前的编译器非常复杂,可以正确完成。
有时会有一点(小)的好处。 如果您通过“+ =”分配事件处理程序,Intellisense自动完成function可能会使代码编写速度更快。
这个有用的唯一时间是它是否会有歧义 – 例如,如果它是MenuItem(string, Delegate)
– 如果有多个匹配签名的同等匹配的重载。 这还包括var
语法(如下所示)和generics类型推断(未显示):
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以后的任何编译器中都是不必要的。
与您的编辑相关 – 添加处理程序并不会因使用new
或不使用new
而受到影响,但删除这样的处理程序会略有不同
listView.ItemClick -= listView_ItemClick;
和
listView.ItemClick -= new ItemClickEventHandler(listView_ItemClick);
虽然不太可能影响大多数情景。 第一个版本,没有new
关键字,据说效率更高。
这篇文章有一个详细的解释,但结论是
所以两者都有效但我们应该使用哪一个? 如果事件在开始/结束时订阅/取消订阅一次,就像在典型的WinForm应用程序中一样,那么它几乎不重要。 但是,如果这样做多次,那么第二种方法是可取的,因为它可以减少昂贵的堆分配,并且可以更快地工作
(该post中的第二种方法是没有new
关键字的方法)
虽然说它对我来说似乎是一种微观优化,但在大多数情况下它不太可能成为瓶颈。