如果一个对象在它的终结器中是 "rereferenced" 会发生什么?

What happens if an object is "rereferenced" in it's finalizer?

显然,在 java; "the object will not be collected until it gets unreachable again" (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);
    }
}

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

这会造成这样一种情况,即在删除对象的最后一个引用和调用终结器之间的一段不可知的时间段内,对象处于不确定状态,位于内存中,没有对它的引用。垃圾回收的自然流程是任何对象都不应该 return 从这个状态。这就像让弗兰肯斯坦栩栩如生。他死了,顺其自然

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