我必须保留对EventHandler委托对象的引用以便稍后取消订阅吗?

时间:2012-04-08 00:43:08

标签: c# events

  

可能重复:
  How to correctly unregister an event handler

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

创建的对象不同

2 个答案:

答案 0 :(得分:1)

这与我想的完全相同,你只关注第二个短手语法位。

How to correctly unregister an event handler

我不会那么回答,但我想补充一下......

如果您愿意,可能需要查看Rx - Reactive Extensions,这可以让您解决这些问题。取消订阅基本上不是强制性的,除非您希望尽快“停止”该事件(这是简化的,有更多详细信息)

答案 1 :(得分:1)

  

-= HandleCustomEvent是否也会创建new()?如果是这样,该对象与+= HandleCustomEvent

创建的对象不同

是的,是的。

据我所知,Delegate.Remove的MSDN文档没有具体说明它如何确定两个代表是否相等。但是,MulticastDelegate.RemoveImpl似乎使用Delegate.Equals来确定相等性,而 已记录在案:

  

比较方法和目标的相同性如下:

     
      
  • 如果被比较的两个方法都是静态的并且在同一个类上是相同的方法,则认为这些方法是相同的,并且目标也被认为是相等的。
  •   
  • 如果要比较的两个方法是实例方法,并且在同一个对象上的方法相同,则认为方法相同,并且目标也被视为相等。
  •   
  • 否则,不认为这些方法是相同的,也不认为目标是相等的。
  •   

因此,即使传递给-=的委托与传递给+=的委托的实例不同,该事件仍会成功取消订阅。