C# 垃圾收集器问题
我有一个库,它返回由IDictionary、IList和primitive类型string以及int组成的层次列表。目前,我无法更改此数据的返回方式 我有另一个强类型类,它正在使用这些数据并将其转换为业务对象。返回的数据中有一个属性列表,我想将其导入强类型类。然后我可以处理层次结构 我的问题是:如果我这样做:C# 垃圾收集器问题,c#,design-patterns,data-structures,garbage-collection,C#,Design Patterns,Data Structures,Garbage Collection,我有一个库,它返回由IDictionary、IList和primitive类型string以及int组成的层次列表。目前,我无法更改此数据的返回方式 我有另一个强类型类,它正在使用这些数据并将其转换为业务对象。返回的数据中有一个属性列表,我想将其导入强类型类。然后我可以处理层次结构 我的问题是:如果我这样做: MyCustomClass.Properties = HierarchicalData["some_name"] 其中MyCustomClass是我的强类型类,HierarchycalD
MyCustomClass.Properties = HierarchicalData["some_name"]
其中MyCustomClass是我的强类型类,HierarchycalData是IDictionary数据,当我稍后调用时会发生什么:
HierarchicalData = null
可以处理和发布分层数据吗?本例中的一些_数据是另一本词典,因此从技术上讲,这就是需要保存的全部内容。我是否需要进行显式复制而不是导入,例如:
MyCustomClass.Properties = HierarchicalData["some_name"].ToDictionary<string, string>( /* selector */)
澄清:我并不担心包含被垃圾收集的属性的字典。我想确保HierarchycalData可以被删除,因为它非常大,我需要与其中几个一起工作。这将如您所期望的那样工作。因为您将在另一个地方创建对HierarchycalData[some_name]引用的字典的引用,所以垃圾收集器将为您保留它
您绝对不需要复制字典。这将按照您的预期工作。因为您将在另一个地方创建对HierarchycalData[some_name]引用的字典的引用,所以垃圾收集器将为您保留它
您肯定不需要复制字典。假设该类返回标准字典,您可能不需要执行任何其他操作 对象可能不包含对包含它们的字典的引用,因此它们可能不会阻止收集字典。
然而,没有检查就无法确定;您应该在Visual Studio调试器的“监视”窗口中检查对象,或者查看源代码,查看它们是否引用字典。假设该类返回标准字典,您可能不需要执行任何其他操作 对象可能不包含对包含它们的字典的引用,因此它们可能不会阻止收集字典。
然而,没有检查就无法确定;您应该在Visual Studio调试器的监视窗口中检查对象,或者查看源代码,查看它们是否引用字典。您不需要执行复制 该行:
MyCustomClass.Properties = HierarchicalData["some_name"]
分配一个引用,当对象的引用处于活动状态时,它将不会被垃圾收集。您不需要执行复制 该行:
MyCustomClass.Properties = HierarchicalData["some_name"]
分配一个引用,当对象的引用处于活动状态时,它将不会被垃圾收集
可以处理和发布分层数据吗
你是说GC?在本例中不是这样,因为它被对象引用。GC不会把事情搞砸的
可以处理和发布分层数据吗
你是说GC?在本例中不是这样,因为它被对象引用。GC不会把事情搞砸的。是的。一旦没有对HierarchycalData的引用,它将成为收集的候选对象
因为您有一个为some_name键存储的数据的引用,所以不会收集另一个字典中的特定元素。但是,就GC而言,另一个未引用的部分将成为无根部分,并在某个时候最终确定。是的。一旦没有对HierarchycalData的引用,它将成为收集的候选对象
因为您有一个为some_name键存储的数据的引用,所以不会收集另一个字典中的特定元素。但是,就GC而言,另一个未引用的部分将成为无根部分,并在某个时候最终确定。Dictionary没有实现IDisposable,因此它不需要也不能被处理。您只希望它被GC收集。是的,这里我说的disposed是指超出范围,因此是收集的候选对象,而不是Dispose。Dictionary不实现IDisposable,所以它不需要也不能被释放。你只想让GC收集。是的,这里我说的disposed是指超出范围,因此是收集的候选对象,而不是Dispose。太棒了,这是我想但想确定的。太棒了,这是我想但想确定的。是的,我只是想在我把它放进试验台并在晚上运行外形测试之前实现最可能的方法。是的,我只是想在我把它放进试验台并在晚上运行外形测试之前实现最可能的方法。