【问题标题】:Dictionary of weak and non-weak references弱引用和非弱引用字典
【发布时间】:2012-08-29 17:50:43
【问题描述】:

我有一个自定义类型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 谢谢,这很有趣。但是字典可能非常大(数万对),如果可以的话,我宁愿不要复制它。
  • 那将是几百 kB。如果是桌面应用,应该没问题。
  • @CodesInChaos 请发表您的评论作为答案,以便我接受。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多