微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# 监听同一个类成员的事件——垃圾回收

如何解决C# 监听同一个类成员的事件——垃圾回收

我只是想问一个关于事件和垃圾收集的基本问题。我知道事件的发布者保留对侦听对象的引用,因此这可以防止收集侦听对象。

我想问一下在这样的情况下会发生什么:

public class Example
{
     private CustomObjectThatPublishesEvent foo = new CustomObjectThatPublishesEvent();

     public Example()
     {
           foo.CustomEvent += (inSender,inArgs) => { Console.Write("I kNow what you did!"); };
     }
}

这里的问题是:这是否会导致垃圾收集出现问题? 就垃圾收集而言,我是否需要取消订阅此事件?

谢谢!

解决方法

TL;DR;

不,如果您知道 CustomObjectThatPublishesEvent 不会泄漏到堆,您通常需要


每个事件的基础是一个字段,类似于 private CustomObjectThatPublishesEvent _CustomEvent。事件处理程序被添加到该委托中。

CustomObjectThatPublishesEvent 对象持有对委托的引用,委托持有对 Example 对象的引用。

当 GC 发生时,GC 引擎会绘制出所有指向对象的链接,从它持有的根开始(例如堆栈和静态字段),标记所有正在使用的对象。其余的被删除。

在这种情况下,Example 对象、事件处理程序和 CustomObjectThatPublishesEvent 对象都没有被引用链接到根对象,因此它们将被删除。

如果可以,最好还是删除处理程序,以保持最佳实践。

但我当然不会让对象 IDisposable 只是为了处理它。

但是:

如果您确定不知道 CustomObjectThatPublishesEvent 不会将自身泄漏到堆中(通过静态变量,甚至是间接的),那么您必须这样做所以。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。