带“new”和不带“new”的接线事件之间的区别
题
在 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 完全相同。
所以回答你的问题,是的,它们是同一件事。
编译器只是推断你想要 someEvent += new EventHandler( Program_someEvent );
-- 你可以看到它创建了新的 EventHandler
MSIL 中两种情况下的对象
其他提示
过去(.NET 1.x 时代)长格式是唯一的方法。在这两种情况下,您都将新建一个委托以指向 Program_someEvent 方法。
我认为没有什么区别。当然,resharper 说第一行有冗余代码。
有点题外话:
您可以实例化一个委托 (new EventHandler(MethodName))
并(如果适用)重用该实例。
不是吗 new XYZEventHandler
require 直到C#2003,而在C#2005 中允许省略冗余代码?
我认为真正判断的一种方法是查看为代码生成的 MSIL。往往是一个很好的酸测试..
我有一个有趣的担心,它可能会以某种方式扰乱 GC..如果不需要以这种方式完成声明新委托类型的所有开销,这似乎很奇怪,你知道吗?
不隶属于 StackOverflow