如何保持对象的弱引用?

时间:2011-10-11 14:04:09

标签: c# garbage-collection weak-references

(仅供参考:这个问题是半理论的。这不是我明确计划做的事情。)

我希望能够保留对我创建的所有对象的引用。也许是这样的:

class Foo
{
    private static List<Foo> AllMyFoos = new List<Foo>();

    public Foo()
    {
        AllMyFoos.Add(this);
    }
}

这样做的麻烦在于,现在我的所有Foos都不会失去焦点并被垃圾收集。有没有办法在不妨碍垃圾收集器的情况下保持参与?

理想情况下,我只是列出了仍在使用的Foos,而不是所有曾经使用过的Foos。

2 个答案:

答案 0 :(得分:6)

使用WeakReference - 它完全符合预期。使用它时要小心 - 每次取消引用时都必须检查引用是否仍然有效

Tutorial


Foo foo = AllMyFoos[index].Target as Foo;
if (foo == null)
{
   // Object was reclaimed, so we can't use it.
}
else
{
   // foo is valid. My theoretical curiosity can be satisfied
}

警告:仅仅因为该对象尚未被垃圾回收并不意味着某人没有在其上调用Dispose,或者以某种其他方式将其置于状态它不准备再次使用。

答案 1 :(得分:1)

有一种特殊的东西,就是这样命名 - WeakReference