显然,在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);
}
}
答案 0 :(得分:1)
如果终结器创建对该对象的新引用,则该对象不会被垃圾回收。但是没有办法知道终结器何时运行或是否会运行。
这创建了一个场景,在对象的最后一次引用被删除和调用终结器之间的不可知时间段内,对象处于不稳定状态,坐在内存中而没有引用它。垃圾收集的自然流程是没有对象应该从这种状态返回。这就像把弗兰肯斯坦带到了生活中。他死了,让大自然走上正轨。
这很有趣但没有实际应用,因为没有理由这样做。根据定义,不存在终结器来维护对象的引用。它唯一能做的就是创造不可预测的行为和错误。