有和没有"新"接线事件之间的区别
时间: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))
并(如果合适)重用该实例。