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

C# 我必须保留对EventHandler委托对象的引用以便以后取消订阅吗?,c#,events,C#,Events,可能重复: 以下两个事件订阅完全相同(C#2.0与1.0语法): 我注意到较新的语法隐藏了委托对象的实例化 我是否需要保留对某个代表的引用,以便以后可以正确取消订阅? // Retain reference to delegate used to subscribe. this.handleCustomEvent = new CustomEventHandler(HandleCustomEvent); publisher.CustomEvent += this.handleCustomEven

可能重复:

以下两个事件订阅完全相同(C#2.0与1.0语法):

我注意到较新的语法隐藏了委托对象的实例化

我是否需要保留对某个代表的引用,以便以后可以正确取消订阅?

// 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
创建的对象不同?

我认为这是完全相同的事情,您只关注了第二个简短的语法位

我不想回答这个问题,但我想补充一点

如果你愿意,你可能想看看是什么让你摆脱了这些问题。取消订阅基本上不是强制性的,除非您希望更快地“停止”活动(这是简化的,有更多的细节)

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

是的,是的

据我所知,的MSDN文档并没有具体说明如何确定两个委托是否相等。但是,
MulticastDelegate.RemoveImpl
似乎用于确定相等性,并且有文档记录:

对方法和目标进行平等性比较,如下所示:

  • 如果所比较的两种方法都是静态的,并且是同一类上的同一方法,则认为这两种方法相等,并且目标也相等
  • 如果正在比较的两种方法是实例方法,并且是同一对象上的同一方法,则认为这两种方法相等,同时也认为目标相等
  • 否则,不认为方法相等,也不认为目标相等

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

谢谢!正是我想要的。现在我可以删除所有我一开始不需要的讨厌的私有字段。感谢您指出
Delegate.Equals
的文档。这很有道理,我假设这是真的,但假设会导致错误。。。
publisher.CustomEvent += HandleCustomEvent;
...
publisher.CustomEvent -= HandleCustomEvent;