有和没有“新”的布线事件之间的区别

时间:2008-08-25 20:59:54

标签: c# events syntax delegates

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

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);

tmrMain.Elapsed += tmrMain_Tick;

两者看起来完全相同。当你输入后者时,C#是否只是假设你是指前者?

6 个答案:

答案 0 :(得分:26)

我做了这个

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

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

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

所以回答你的问题,是的,他们是一回事 编译器只是推断你想要someEvent += new EventHandler( Program_someEvent );
- 您可以在MSIL

中看到它在两种情况下都创建新的EventHandler对象

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

有点偏离主题:

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

答案 4 :(得分:0)

在C#2003之前,new XYZEventHandler是否需要,并且您被允许省略C#2005中的冗余代码?

答案 5 :(得分:-1)

我认为真正告诉的一种方法是查看为代码生成的MSIL。趋向于进行良好的酸性测试..

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