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

时间:2012-01-17 09:55:11

标签: c# .net com delegates event-handling

我在班上定义了新成员

protected COMObject.Call call_ = null;

此类具有我订阅的以下事件处理程序

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

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

call_ = null;

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

4 个答案:

答案 0 :(得分:30)

是的,您应该使用重载-=取消订阅活动。

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

答案 1 :(得分:8)

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

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

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

How to: Subscribe to and Unsubscribe from Events (C# Programming Guide)

更多信息:

Why you should always unscubscribe event handlers

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

Delegate[] dary = TermCheckScore.GetInvocationList();

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