【发布时间】: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