繁体   English   中英

订阅我自己的 C# 事件会造成内存泄漏吗?

[英]Would subscribing to my own C# event create a memory leak?

如果一个基类发布一个 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) => 
    {
    }

}

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

暂无
暂无

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

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