2

我有一个自定义类型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但似乎这种方法不能处理“更改和未引用”的情况。

我应该如何将创建的对象存储在字典中,以便它们:

  • 可能被垃圾收集
  • 未引用但更改时是否不收集垃圾?
4

1 回答 1

4

扩展 CodesInChaos 的答案,我认为您在原始文件中使用弱引用是正确的Dictionary,我认为使用第二种数据结构是有意义的 - 可能在HashSet这里工作得很好 - 只保存对已被引用的对象的引用改变了。

请记住,存储对对象的引用很便宜。我认为在它开始引起关注之前,您必须获得数百万或数十亿的参考。

于 2012-08-29T18:07:12.510 回答