C# 弱引用和非弱引用词典

C# 弱引用和非弱引用词典,c#,.net,garbage-collection,weak-references,C#,.net,Garbage Collection,Weak References,我有一个自定义类型MyClass和一个工厂类factory,可根据请求创建MyClass类型的对象 工厂将创建的对象存储在字典中,因为创建对象的成本很高,而且有时会要求多次创建同一对象。具有相同标记的每个对象只能创建一次 class MyObject { // .. not important } class Factory { private Dictionary<int, MyObject> m_objects = new Dictionary<int,

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

工厂
将创建的对象存储在字典中,因为创建对象的成本很高,而且有时会要求多次创建同一对象。具有相同标记的每个对象只能创建一次

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;
    }
}
类MyObject
{
//…不重要
}
阶级工厂
{
私有字典m_objects=新字典();
公共MyObject CreateObject(int标记,参数对象[]参数)
{
肌体;
如果(!m_objects.TryGetValue(标记,输出对象))
{
obj=新的MyObject();
//…一些初始化
m_objects.Add(标记,对象);
}
返回obj;
}
}
对象可能存储在或不存储在
工厂
之外的某个位置,存储时间未知。对象可能在创建后更改。有时
工厂
会存储对对象的引用,而对象不会存储在其他任何地方

现在我想让垃圾收集器完成它的工作。我希望对象不存储在
工厂之外的任何位置,也不更改
以收集对象

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

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

  • 垃圾可以收集吗
  • 未被引用但发生更改时是否进行垃圾收集

扩展CodesInChaos的回答,我认为您在原始
字典中使用弱引用是正确的,我认为使用第二个数据结构是有意义的,可能是一个
哈希集
,它只保存对已更改对象的引用


记住,存储对对象的引用很便宜。我认为在它开始成为一个问题之前,你必须有数以百万或数十亿计的参考资料

扩展CodesInChaos的回答,我认为您在原始
字典中使用弱引用是正确的,我认为使用第二个数据结构是有意义的,可能一个
哈希集在这里可以很好地工作,它只保存对已更改对象的引用


记住,存储对对象的引用很便宜。我认为在它开始成为一个问题之前,你必须有数以百万或数十亿计的参考资料

创建一个额外的字典,将所有更改的对象放入其中,怎么样?@CodesInChaos谢谢,这很有趣。但字典可能非常大(数万对),如果可能的话,我宁愿不复制它,也就是几百kB。如果它是桌面应用程序,那应该没问题。@CodesInChaos请将您的评论作为答案发布,这样我就可以接受它。创建一个附加字典,将所有更改的对象放入其中如何?@CodesInChaos谢谢,这很有趣。但字典可能非常大(数万对),如果可能的话,我宁愿不复制它,也就是几百kB。若它是桌面应用程序,那个就可以了。@CodesInChaos请将你们的评论作为答案发布,这样我就可以接受了。