MSDN states以下两个事件订阅完全等效(C#2.0 vs 1.0语法):
publisher.CustomEvent += HandleCustomEvent;
publisher.CustomEvent += new CustomEventHandler(HandleCustomEvent);
我注意到较新的语法隐藏了委托对象的实例化。
我是否需要保留对代理人的引用,以便我以后可以正确取消订阅?
// Retain reference to delegate used to subscribe.
this.handleCustomEvent = new CustomEventHandler(HandleCustomEvent);
publisher.CustomEvent += this.handleCustomEvent;
...
// Use earlier reference to unsubscribe.
publisher.CustomEvent -= this.handleCustomEvent;
或者,这是一回事吗?
publisher.CustomEvent += HandleCustomEvent;
...
publisher.CustomEvent -= HandleCustomEvent;
如果它们相同,为什么?
-= HandleCustomEvent
是否也会创建new()
?如果是这样,该对象与+= HandleCustomEvent
答案 0 :(得分:1)
这与我想的完全相同,你只关注第二个短手语法位。
How to correctly unregister an event handler
我不会那么回答,但我想补充一下......
如果您愿意,可能需要查看Rx - Reactive Extensions,这可以让您解决这些问题。取消订阅基本上不是强制性的,除非您希望尽快“停止”该事件(这是简化的,有更多详细信息)
答案 1 :(得分:1)
创建的对象不同
-= HandleCustomEvent
是否也会创建new()
?如果是这样,该对象与+= HandleCustomEvent
是的,是的。
据我所知,Delegate.Remove的MSDN文档没有具体说明它如何确定两个代表是否相等。但是,MulticastDelegate.RemoveImpl
似乎使用Delegate.Equals来确定相等性,而 已记录在案:
比较方法和目标的相同性如下:
- 如果被比较的两个方法都是静态的并且在同一个类上是相同的方法,则认为这些方法是相同的,并且目标也被认为是相等的。
- 如果要比较的两个方法是实例方法,并且在同一个对象上的方法相同,则认为方法相同,并且目标也被视为相等。
- 否则,不认为这些方法是相同的,也不认为目标是相等的。
因此,即使传递给-=
的委托与传递给+=
的委托的实例不同,该事件仍会成功取消订阅。