繁体   English   中英

弱引用和非弱引用的字典

[英]Dictionary of weak and non-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中字典中的值使用弱引用,但似乎这种方法无法处理“更改和未引用”的情况。

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

  • 可以垃圾收集
  • 不引用但更改时不收集垃圾吗?

扩展CodesInChaos的答案,我认为您使用原始Dictionary弱引用在正确的轨道上,并且我认为使用第二个数据结构(可能在此处适用于HashSet是有意义的,该结构仅保存对对象的引用已经改变了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM