我有一个库,它返回一个由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__,因为它很大,我需要使用其中的几个。
答案 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不会弄乱它。