有和没有“新”的接线事件之间的区别
Posted
技术标签:
【中文标题】有和没有“新”的接线事件之间的区别【英文标题】:Difference between wiring events with and without "new" 【发布时间】:2010-09-06 19:31:21 【问题描述】:在 C# 中,这两行代码有什么区别(如果有的话)?
tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);
和
tmrMain.Elapsed += tmrMain_Tick;
两者的工作方式似乎完全相同。当您键入后者时,C# 是否只是假设您指的是前者?
【问题讨论】:
嗯,它们都工作正常。那么为什么 Visual Studio 在自动创建事件处理程序存根时会选择前者而不是后者呢? 该功能可以追溯到 Visual Studio 2005 之前,它引入了更短的语法。 【参考方案1】:我做了这个
static void Hook1()
someEvent += new EventHandler( Program_someEvent );
static void Hook2()
someEvent += Program_someEvent;
然后在代码上运行 ildasm。 生成的 MSIL 完全一样。
所以要回答您的问题,是的,它们是相同的。
编译器只是推断你想要someEvent += new EventHandler( Program_someEvent );
-- 您可以在 MSIL 中看到它在两种情况下都创建了新的 EventHandler
对象
【讨论】:
【参考方案2】:过去(.NET 1.x 天)长格式是唯一的方法。在这两种情况下,您都在新建一个委托以指向 Program_someEvent 方法。
【讨论】:
【参考方案3】:我认为没有任何区别。当然 resharper 说第一行有多余的代码。
【讨论】:
【参考方案4】:有点题外话:
您可以实例化一个委托 (new EventHandler(MethodName))
并(如果适用)重用该实例。
【讨论】:
【参考方案5】:在 C#2003 之前,new XYZEventHandler
不是必需的,并且您可以省略 C#2005 中的冗余代码吗?
【讨论】:
【参考方案6】:我认为真正判断的一种方法是查看为代码生成的 MSIL。往往是一个很好的酸性测试。
我有一个有趣的担忧,它可能会以某种方式与 GC 混淆。如果不需要以这种方式声明新的委托类型,那么声明新的委托类型会产生所有开销,这似乎很奇怪,你知道吗?
【讨论】:
以上是关于有和没有“新”的接线事件之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
点击事件click和.on('click') 两者之间的区别
通过IL分析C#中的委托事件FuncActionPredicate之间的区别与联系