弱和非弱引用的字典

时间:2012-08-29 17:50:44

标签: c# .net garbage-collection weak-references

我有一个自定义类型MyClass和一个工厂类Factory,可根据请求创建MyClass类型的对象。

Factory存储在字典中创建的对象,因为对象的创建成本很高,并且有时可以要求多次创建相同的对象。必须仅创建一次具有相同标记的每个对象。

class MyObject
{
    // .. not important
}

class Factory
{
    private Dictionary<int, MyObject> m_objects = new Dictionary<int, MyObject>();

    public MyObject CreateObject(int tag, params object[] parameters)
    {
        MyObject obj;
        if (!m_objects.TryGetValue(tag, out obj))
        {
            obj = new MyObject();
            // .. some initialization
            m_objects.Add(tag, obj);
        }

        return obj;
    }
}

对象可能并且可能不会存储在 Factory之外的某个地方未知的时间。创建后,对象可能会被更改。有时Factory存储对象的引用,而对象不存储在其他任何地方。

现在我想让垃圾收集器完成它的工作。我希望收集未存储在Factory之外的任何位置且未更改的对象。

我的第一个想法是对Factory内的字典中的值使用弱引用,但似乎这种方法不处理“已更改和未引用”的情况。

如何将创建的对象存储在字典中,使它们成为:

  • 可能是垃圾收集
  • 未引用但未更改垃圾?

1 个答案:

答案 0 :(得分:4)

扩展了CodesInChaos的回答,我认为你使用原始Dictionary中的弱引用走在正确的轨道上,我认为使用第二个数据结构是有道理的 - 可能是HashSet在这里运作良好 - 只保存对已更改对象的引用。

请记住,将引用存储到对象中很便宜。在开始成为一个问题之前,我认为你必须要数百万或数十亿的参考。