我有一个自定义类型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
在这里工作得很好-它只包含对已更改对象的引用。
请记住,存储对对象的引用非常便宜。我认为在它开始成为一个问题之前,你必须有数百万或数十亿的参考文献。