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

Difference between wiring events with and without "new"

提问人:Blorgbeard 提问时间:8/26/2008 最后编辑:nawfalBlorgbeard 更新时间:7/7/2014 访问量:3540

问:

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

tmrMain.Elapsed += new ElapsedEventHandler(tmrMain_Tick);

tmrMain.Elapsed += tmrMain_Tick;

两者的工作方式似乎完全相同。C# 在键入后者时是否只是假设您指的是前者?

C# 事件 语法 委托

评论

0赞 Vaibhav 8/26/2008
好吧,他们都工作得很好。那么,为什么 Visual Studio 在自动创建事件处理程序存根时会选择前者而不是后者呢?
0赞 SLaks 6/26/2009
该功能可以追溯到 Visual Studio 2005 之前,它引入了较短的语法。

答:

26赞 Orion Edwards 8/26/2008 #1

我做到了

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

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

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

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

2赞 Ray 8/26/2008 #2

我不认为有什么区别。当然,resharper 说第一行有冗余代码。

-1赞 Rob Cooper 8/26/2008 #3

我认为真正判断的一种方法是查看为代码生成的 MSIL。往往是一个很好的酸性测试。.

我有一种有趣的担心,它可能会以某种方式扰乱 GC..如果不需要以这种方式声明新的委托类型,那么声明新的委托类型的所有开销似乎很奇怪,你知道吗?

0赞 Timbo 8/26/2008 #4

直到 C#2003 才有要求,并且允许您省略 C#2005 中的冗余代码吗?new XYZEventHandler

5赞 denis phillips 8/26/2008 #5

过去(.NET 1.x 天)长格式是唯一的方法。在这两种情况下,您都会新建一个委托以指向 Program_someEvent 方法。

2赞 Andrei Rînea 8/26/2008 #6

有点跑题了:

您可以实例化委托并(如果适用)重用该实例。(new EventHandler(MethodName))