以下两种订阅活动的方式有什么区别?
receiver.ConfigChanged += Config_ConfigChanged;
receiver.ConfigChanged += new EventHandler(Config_ConfigChanged);
似乎两者的工作方式相同,但如果是这样,使用第二种方法有什么意义呢?
如果取消订阅,以下两种方法的工作方式是否相同?
receiver.ConfigChanged -= Config_ConfigChanged;
receiver.ConfigChanged -= new EventHandler(Config_ConfigChanged);
答案 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。
如果您不关心跟踪处理程序,则使用详细方式。