分配null是否从对象中删除所有事件处理程序?

我在class上定义了新成员

protected COMObject.Call call_ = null; 

这个类有我订阅的以下事件处理程序

 call_.Destructed += new COMObject.DestructedEventHandler(CallDestructedEvent); 

将我的成员设置为null,如下所示删除事件处理程序?

 call_ = null; 

或者我必须取消订阅 – =?

是的,你应该使用重载-=来取消订阅一个事件。

简单地将引用赋值为null将不会自动执行此操作。 该对象仍将监听该事件。

在设置为null或处理对象之前,您应该始终取消订阅事件处理程序(=设置变量为null将不会取消订阅所有处理程序),如下面的MSDN摘录中所示:

要防止在引发事件时调用事件处理程序,只需取消订阅该事件即可。 为了防止资源泄漏,在处置订阅者对象之前取消订阅事件非常重要。 在取消订阅事件之前,发布对象中作为事件基础的多播委托具有对封装订阅者事件处理程序的委托的引用。 只要发布对象保存该引用,您的订阅者对象就不会被垃圾回收。

Unsubscribing部分的以下链接中解释:

如何:订阅和取消订阅事件(C#编程指南)

更多信息:

为什么你应该总是取消订阅事件处理程序

您必须使用减法赋值运算符( – =) 取消订阅事件。 只有在所有订阅者都从事件中取消订阅后,发布者类中的事件实例才会设置为null。

删除所有事件,假设事件是“Action”类型:

 Delegate[] dary = TermCheckScore.GetInvocationList(); if ( dary != null ) { foreach ( Delegate del in dary ) { TermCheckScore -= ( Action ) del; } }