弱引用和非弱引用词典



我有一个自定义类型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中对字典中的值使用弱引用,但这种方法似乎无法处理"更改和未引用"的情况。

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

  • 可能是垃圾收集
  • 未被引用但已更改时是否进行了垃圾收集

扩展CodesInChaos的答案,我认为您在原始Dictionary中使用弱引用是正确的,并且我认为使用第二个数据结构是有意义的-可能HashSet在这里工作得很好-它只包含对已更改对象的引用。

请记住,存储对对象的引用非常便宜。我认为在它开始成为一个问题之前,你必须有数百万或数十亿的参考文献。

相关内容

  • 没有找到相关文章

最新更新