14

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

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);

tmrMain.Elapsed += tmrMain_Tick;

两者的工作方式似乎完全相同。当您键入后者时,C# 是否只是假设您的意思是前者?

4

6 回答 6

26

我做了这个

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

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

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

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

于 2008-08-25T21:02:27.847 回答
4

过去(.NET 1.x 天)长格式是唯一的方法。在这两种情况下,您都在新建一个委托以指向 Program_someEvent 方法。

于 2008-08-25T21:15:55.363 回答
2

我不认为有任何区别。当然 resharper 说第一行有冗余代码。

于 2008-08-25T21:05:48.790 回答
2

一点题外话:

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

于 2008-08-25T22:31:30.470 回答
0

直到 C#2003才new XYZEventHandler需要,并且允许您省略 C#2005 中的冗余代码?

于 2008-08-25T21:13:04.090 回答
-1

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

我有一个有趣的担忧,它可能会以某种方式与 GC 混淆。如果不需要以这种方式声明新的委托类型,那么声明新的委托类型会产生所有开销,这似乎很奇怪,你知道吗?

于 2008-08-25T21:06:26.183 回答