Csharp/C#教程:分配null是否从对象中删除所有事件处理程序?分享


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

我在class上定义了新成员

protected COMObject.Call call_ = null; 

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

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

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

 call_ = null; 

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

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

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

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

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

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

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

更多信息:

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

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

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

上述就是C#学习教程:分配null是否从对象中删除所有事件处理程序?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)

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

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ctvol.com/cdevelopment/999833.html

(0)
上一篇 2021年12月27日
下一篇 2021年12月27日

精彩推荐