繁体   English   中英

C# 监听同一 class 成员的事件 - 垃圾收集

[英]C# Listen to event of same class member - Garbage Collection

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

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

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

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

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

谢谢!

TL;博士;

不,如果您知道CustomObjectThatPublishesEvent不会泄漏到堆中,您通常不需要这样做。


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

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

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

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

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

但我当然不会为了处理这个问题而制作 object IDisposable

然而:

如果您不确定CustomObjectThatPublishesEvent不会将自身泄漏到堆中(通过 static 变量,甚至间接地),那么您必须这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM