【问题标题】:Would subscribing to my own C# event create a memory leak?订阅我自己的 C# 事件会造成内存泄漏吗?
【发布时间】:2019-12-26 19:36:00
【问题描述】:

如果一个基类发布一个 C# 事件并且派生类订阅它——即订阅它自己——。事件订阅会阻止对象被垃圾收集吗?或者垃圾收集器是否足够聪明,可以检测到这种循环引用情况。

乍一看,它似乎应该这样做,但我很确定我已经看到了执行此操作的控制代码。这是一个如此基本的问题,我不敢相信我以前从未研究过。

编辑:对于 Juan R. 我的意思是这样的。 (从未编译过这段代码,只是在我的脑海中输入了它,所以我可能有错别字/错误)

public class Base
{ 
    event EventHandler<double>   ValueChanged;
}

public class Derived : Base
{
    public Derived()
    {
        // Will this prevent my object from being collected?

        ValueChanged += OnValueChanged;
    }
    private void OnValueChanged(object sender, double v) => 
    {
    }

}

【问题讨论】:

  • 嗨乔。请发布示例代码以说明您的要求。
  • @V0ldek:撤回。
  • @JuanR 我编辑了我的答案以表明我的意思,但看起来 user560822 的答案正是我想要的

标签: c# events


【解决方案1】:

订阅自己的事件的对象不会导致内存泄漏,原因很简单,因为 CLR GC 是基于可达性,而不是引用计数。如果对象可以从 GC 根访问,那么它无论如何都不符合 GC 条件。如果它不可访问,那么自引用不会使其可访问。关于GCing circular references 的事件没有什么特别之处。

【讨论】:

  • 很有趣,我以为是这样的。我只是选择了错误的搜索词。我应该搜索“循环引用”这个词谢谢
  • @Joe 我只有 99% 的把握这是正确的答案。在接受答案之前等待投票是个好主意。
  • 我确实点击了您提供的链接,这似乎当然同意您的看法——加上一大堆的支持
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 2020-04-17
  • 1970-01-01
  • 2014-05-13
  • 2013-09-03
  • 1970-01-01
  • 2022-10-12
相关资源
最近更新 更多