0

我有一个类(我们称之为a类),它包含一个指向“a类”的“参考类”(我们称之为参考类b)。

这将创建一个循环连接,如果对“class a”和“reference class b”的所有其他引用都将被删除,它们仍然会有引用它们的类。C# 中的垃圾收集是否足够强大,只能检测到这个内部循环,或者我是否需要在收集之前以某种方式破坏该链接(一旦所有外部链接都被破坏,这将是不可能的)

请参阅以下示例代码,了解两者如何相互引用。

Public Class ClassA
{
    Private ReferenceClassB reference;
    Public ClassA()
    {
        reference = new ReferenceClassB(this);
    }

}

Public Class ReferenceClassB
{
    Private ClassA referencedClass;
    Public ReferenceClassB(ClassA reference)
    {
        referencedClass = reference;
    }
}

如果将 ClassA 的版本设置为外部,然后设置为 null,则使用上述 2 个类,仍然存在对该 Object 的引用,同样与创建的 ReferenceClassB 对象一样。但是这些对象不会连接到“主程序”,所以理论上它们对于垃圾收集器来说是安全的清理,但实际的实现是否足够聪明以摆脱它们?

4

1 回答 1

2

是的,垃圾收集器处理循环引用。在stackoverflow上检查这个问题。

更新:

您可以使用以下代码进行测试:

public class ClassA
{
    private ReferenceClassB reference;
    public ClassA()
    {
        reference = new ReferenceClassB(this);
    }

}

public class ReferenceClassB
{
    private ClassA referencedClass;
    public ReferenceClassB(ClassA reference)
    {
        referencedClass = reference;
    }
}
class Program
{
    static void Main(string[] args)
    {
        ClassA a = new ClassA();
        ReferenceClassB b = (ReferenceClassB) a.GetType().GetField("reference", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(a);
        WeakReference weakA = new WeakReference(a);
        WeakReference weakB = new WeakReference(b);
        a = null;
        b = null;
        GC.Collect();
        Debug.Assert(weakA.IsAlive==false);
        Debug.Assert(weakB.IsAlive==false);
    }
}
于 2013-08-25T16:18:53.227 回答