有和没有"新"接线事件之间的区别

时间:2020-03-05 18:43:02  来源:igfitidea点击:

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

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);

tmrMain.Elapsed += tmrMain_Tick;

两者似乎工作完全相同。当键入后者时,Cjust是否假设我们是指前者?

解决方案

回答

我做了这个

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

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

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

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

回答

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

回答

我认为真正说明问题的一种方法是查看为代码生成的MSIL。倾向于进行良好的酸性测试。

我有一个有趣的担忧,那就是它可能会与GC混为一谈。似乎很奇怪,如果永远不需要用这种方法来声明新的委托类型,那将产生所有开销。

回答

新的XYZEventHandler直到C#2003才需要,并且我们被允许在C#2005中省略冗余代码吗?

回答

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

回答

有点题外话:

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