C#为什么我在订阅活动时会使用“new”关键字?

时间:2011-10-13 08:18:37

标签: c# .net events delegates

以下两种订阅活动的方式有什么区别?

receiver.ConfigChanged += Config_ConfigChanged;

receiver.ConfigChanged += new EventHandler(Config_ConfigChanged);

似乎两者的工作方式相同,但如果是这样,使用第二种方法有什么意义呢?

如果取消订阅,以下两种方法的工作方式是否相同?

receiver.ConfigChanged -= Config_ConfigChanged;

receiver.ConfigChanged -= new EventHandler(Config_ConfigChanged);

4 个答案:

答案 0 :(得分:12)

详细的方式适用于所有版本的C#,这只是C#2及更高版本的简短方法。所以我认为现在没有理由长期使用。

在某些情况下,您仍然需要使用new DelegateType(methodGroup),但事件订阅不是其中之一。这些情况通常涉及泛型类型推断或方法重载。

取消订阅将以任何方式工作,因为它基于值相等而不是引用相等。如果我没记错的话,方法组的隐式转换和显式new都转换为相同的IL代码。隐式转换只是语法糖。

答案 1 :(得分:2)

Visual Studio的TAB事件自动完成始终默认为.Net 1.0的处理方式,无论您使用的是哪种版本的框架。你可能会发现一些习惯于阅读旧方式的人。通过使用Resharper,我只是遇到了那种不那么冗长的方式!

这是一篇关于事件订阅的MSDN文章 - 它确切地说明了@CodeInChaos刚确认的内容:http://msdn.microsoft.com/en-us/library/ms366768%28v=vs.80%29.aspx

答案 2 :(得分:0)

如果我错了,请纠正我,但我不知道这是否有效

receiver.ConfigChanged += new EventHandler(Config_ConfigChanged);
receiver.ConfigChanged -= new EventHandler(Config_ConfigChanged);

因为这是两个不同的实例 我想这会

var configChanged = new EventHandler(Config_ConfigChanged);
receiver.ConfigChanged += configChanged;
receiver.ConfigChanged -= configChanged;

但话又说回来,为什么不使用

receiver.ConfigChanged += Config_ConfigChanged;
receiver.ConfigChanged -= Config_ConfigChanged;

答案 3 :(得分:0)

好的

receiver.ConfigChanged -= Config_ConfigChanged;

将清除所有引用该方法的事件处理程序。

var eventHandler = new EventHandler(Config_ConfigChanged); 

receiver.ConfigChanged += eventHandler;
receiver.ConfigChanged += new EventHandler(Config_ConfigChanged); 

receiver -= eventHandler;

只会清除一个eventHandler。

如果您不关心跟踪处理程序,则使用详细方式。