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

2023-12-20

如果基类发布 C# 事件并且派生类订阅该事件(即订阅其自身)。事件订阅会阻止对象被垃圾收集吗?或者垃圾收集器是否足够聪明来检测这种循环引用情况。

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

编辑:胡安·R.我的意思是这样的。 (从未编译过这段代码,只是凭空输入,所以我可能会出现拼写错误/错误)

public class Base
{
    public 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 的条件。如果它不可访问,则自引用不会使其可访问。就事件而言,没有什么特别的GCing 循环引用 https://stackoverflow.com/questions/8840567/garbage-collector-and-circular-reference.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐