使用“new”和不使用“new”有何区别?- 事件绑定的差异

14

C# 中,这两行代码有什么区别(如果有的话)?

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);

tmrMain.Elapsed += tmrMain_Tick;

两者看起来完全一样,C#是不是默认你在输入后者时实际上指的是前者?


它们都能正常工作。那么为什么Visual Studio在自动创建事件处理程序存根时选择前者而不是后者呢? - Vaibhav
该功能可以追溯到 Visual Studio 2005 之前,当时引入了更短的语法。 - SLaks
6个回答

26

我做了这个。

static void Hook1()
{
    someEvent += new EventHandler( Program_someEvent );
}

static void Hook2()
{
    someEvent += Program_someEvent;
}

然后在代码上运行ildasm。
生成的MSIL完全相同。

所以回答你的问题,是的它们是同一件事。
编译器只是推断你想要someEvent += new EventHandler( Program_someEvent );
-- 你可以在MSIL中看到它在两种情况下都创建了新的EventHandler对象。


5

在以前的.NET 1.x版本中,只有使用长形式才能实现这个功能。在两种情况下,您都需要新建一个委托来指向Program_someEvent方法。


2

我认为这两种写法没有什么区别。当然,Resharper会指出第一行代码是多余的。


2

有点偏题:

您可以实例化一个委托 (new EventHandler(MethodName)) 并(如果适用)重复使用该实例。


0

在C#2003之前不是需要使用new XYZEventHandler吗?而在C#2005中,你可以省略冗余的代码,对吧?


-1

我认为真正判断的方法是查看代码生成的 MSIL.. 这往往是一个很好的酸性测试..

我有一些有趣的担忧,它可能会与 GC 产生冲突.. 如果不需要以这种方式完成,声明新委托类型的所有开销似乎都很奇怪,你知道吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接