在 C# 中,这两行代码有什么区别(如果有的话)?
tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);
和
tmrMain.Elapsed += tmrMain_Tick;
两者的工作方式似乎完全相同。当您键入后者时,C# 是否只是假设您的意思是前者?
我做了这个
static void Hook1()
{
someEvent += new EventHandler( Program_someEvent );
}
static void Hook2()
{
someEvent += Program_someEvent;
}
然后在代码上运行 ildasm。
生成的 MSIL 完全相同。
因此,要回答您的问题,是的,它们是相同的。
编译器只是在推断你想要的——你可以在 MSIL 中someEvent += new EventHandler( Program_someEvent );
看到它在两种情况下都创建了新对象EventHandler
过去(.NET 1.x 天)长格式是唯一的方法。在这两种情况下,您都在新建一个委托以指向 Program_someEvent 方法。
我不认为有任何区别。当然 resharper 说第一行有冗余代码。
一点题外话:
您可以实例化一个委托(new EventHandler(MethodName))
并(如果合适)重用该实例。
直到 C#2003才new XYZEventHandler
需要,并且允许您省略 C#2005 中的冗余代码?
我认为真正判断的一种方法是查看为代码生成的 MSIL。往往是一个很好的酸性测试。
我有一个有趣的担忧,它可能会以某种方式与 GC 混淆。如果不需要以这种方式声明新的委托类型,那么声明新的委托类型会产生所有开销,这似乎很奇怪,你知道吗?