如果一个对象在其终结器中被“重新引用”会发生什么?

时间:2017-05-02 17:48:05

标签: c# finalizer

显然,在java中; “在再次无法访问之前,不会收集该对象”(What if a finalizer makes an object reachable?)。我假设在C#中也一样,但是它呢?

一个简单的例子:

public static void MyWeakCache
{
    private static readonly ICollection<WeakReference<MyFinalizableObject>> cache;
    private static readonly IList<MyFinalizableObject> pendingRemoval;

    // Other implementation

    public static void Register(MyFinalizableObject myObj)
    {
        cache.Add(new WeakReference<MyFinalizableObject>(myObj));
    }

    public static void Deregister(MyFinalizableObject myObj)
    {
        pendingRemoval.Add(myObj);
    }
}

public class MyFinalizableObject
{
    public MyFinalizableObject() 
    {
        MyWeakCache.Register(this);
    }

    ~MyFinalizableObject()
    {
        // Object is reachable again after this call.
        MyWeakCache.Deregister(this);
    }
}

1 个答案:

答案 0 :(得分:1)

如果终结器创建对该对象的新引用,则该对象不会被垃圾回收。但是没有办法知道终结器何时运行或是否会运行。

这创建了一个场景,在对象的最后一次引用被删除和调用终结器之间的不可知时间段内,对象处于不稳定状态,坐在内存中而没有引用它。垃圾收集的自然流程是没有对象应该从这种状态返回。这就像把弗兰肯斯坦带到了生活中。他死了,让大自然走上正轨。

这很有趣但没有实际应用,因为没有理由这样做。根据定义,不存在终结器来维护对象的引用。它唯一能做的就是创造不可预测的行为和错误。