【问题标题】:C# Garbage Collector questionC# 垃圾收集器问题
【发布时间】:2010-01-08 02:11:01
【问题描述】:

我有一个库,它返回一个由 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__ 被删除,因为它非常大,我需要使用其中的几个。

【问题讨论】:

  • Dictionary 没有实现IDisposable,因此不需要(也不能)处置它。您只是希望它被 GC 收集。
  • 是的,这里我说的处置是指超出范围,因此是收集的候选对象,而不是像 Dispose() 中那样。

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


【解决方案1】:

是的。一旦没有对HierarchicalData 的引用,它将成为收集的候选对象。

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

【讨论】:

  • 太棒了,这就是我的想法,但想确认一下。
【解决方案2】:

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

你绝对不需要复制字典。

【讨论】:

    【解决方案3】:

    假设该类返回标准Dictionary&lt;TKey, TValue&gt;,您可能不需要做任何其他事情。

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

    【讨论】:

    • 是的,我只是想实现最有可能的方法,然后再将它放入测试台并在夜间运行配置文件测试。
    【解决方案4】:

    您不需要执行复制。

    行:

    MyCustomClass.Properties = HierarchicalData["some_name"] 
    

    分配一个引用,当对对象的引用处于活动状态时,它不会被垃圾回收。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 2011-02-23
        • 2011-06-03
        • 2014-03-31
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多