指定null是否删除对象中的所有事件处理程序

本文关键字:事件处理 程序 null 是否 删除 对象 指定 | 更新日期: 2023-09-27 18:20:26

我在类中定义了新成员

protected COMObject.Call call_ = null;

这个类有下面的事件处理程序,我订阅了

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

将我的成员设置为null会删除事件处理程序吗?

call_ = null;

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

指定null是否删除对象中的所有事件处理程序

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

简单地将引用分配给CCD_ 2不会自动做到这一点。对象仍将侦听该事件。

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

要防止在引发事件时调用事件处理程序,只需取消订阅该事件即可。为了防止资源泄漏,重要的是在处理订阅者对象之前取消订阅事件。在取消订阅某个事件之前,位于发布对象中该事件基础上的多播委托具有对封装订阅服务器的事件处理程序的委托的引用。只要发布对象包含该引用,订阅服务器对象就不会被垃圾回收

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

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

更多信息,请访问:

为什么您应该始终取消订阅事件处理程序

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

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

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