我有一个自定义类型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
内的字典中的值使用弱引用,但似乎这种方法不处理“已更改和未引用”的情况。
如何将创建的对象存储在字典中,使它们成为:
答案 0 :(得分:4)
扩展了CodesInChaos的回答,我认为你使用原始Dictionary
中的弱引用走在正确的轨道上,我认为使用第二个数据结构是有道理的 - 可能是HashSet
在这里运作良好 - 只保存对已更改对象的引用。
请记住,将引用存储到对象中很便宜。在开始成为一个问题之前,我认为你必须要数百万或数十亿的参考。