C#垃圾收集器问题

时间:2010-01-08 02:11:02

标签: c# design-patterns data-structures garbage-collection

我有一个库,它返回一个由IDictionary,IList和原始类型(字符串和整数)组成的分层列表。目前我无法改变这些数据的返回方式。

我有另一个强类型类,它使用这些数据并将其转换为业务对象。返回的数据中有一个“属性”列表,我想将其导入到强类型类中。然后,我可以处理层次结构。

我的问题是:如果我这样做:

MyCustomClass.Properties = HierarchicalData["some_name"]

MyCustomClass是我的强类型类,而HierarchicalData是IDictionary数据,当我稍后调用时会发生什么:

HierarchicalData = null

可以处理和发布分层数据吗?在这种情况下,“some_data”是另一个词典,因此从技术上讲,这就是需要保留的全部内容。我是否需要进行显式复制而不是导入,例如:

MyCustomClass.Properties = HierarchicalData["some_name"].ToDictionary<string, string>( /* selector */)

澄清:我并不担心包含垃圾收集属性的字典。我想确保删除HierarchicalData __can__,因为它很大,我需要使用其中的几个。

5 个答案:

答案 0 :(得分:2)

是。一旦没有HierarchicalData的引用,它就会成为收集候选者。

由于您引用了为“some_name”键存储的数据,因此不会收集该特定元素(另一个字典)。但是,就GC而言,其他未引用的部分将无根据,并在某些时候最终确定。

答案 1 :(得分:1)

这将按预期工作。因为您将在另一个地方创建对HierarchicalData["some_name"]引用的字典的引用,所以垃圾收集器会为您保留它。

你绝对不需要复制字典。

答案 2 :(得分:1)

假设该类返回标准Dictionary<TKey, TValue>,您可能不需要执行任何其他操作。

对象可能不包含对包含它们的字典的引用,因此它们可能不会阻止收集字典。
但是,没有检查就无法确定;您应该检查Visual Studio调试器的Watch窗口中的对象(或查看源代码),看看它们是否引用了字典。

答案 3 :(得分:0)

您无需执行复制。

该行:

MyCustomClass.Properties = HierarchicalData["some_name"] 

指定一个引用,当对象的引用存活时,它不会被垃圾回收。

答案 4 :(得分:0)

  

可以处理和发布分层数据吗?

你的意思是GC吗?不是在这种情况下,因为它被您的对象引用。 GC不会弄乱它。