1

可能重复:
如何正确注销事件处理程序

MSDN 声明以下两个事件订阅完全相同(C# 2.0 与 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

4

2 回答 2

1

这与我认为的完全相同,您只关注第二个速记语法位。

如何正确注销事件处理程序

我不会回答这个问题,但我想添加这个......

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

于 2012-04-08T00:58:26.940 回答
1

是否-= HandleCustomEvent还创建一个new()?如果是这样,这个对象是否与创建的对象不同+= HandleCustomEvent

是的,是的。

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

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

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

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

于 2012-04-08T01:09:55.227 回答