【问题标题】:Memory scope of an anonymous object - C#.Net匿名对象的内存范围 - C#.Net
【发布时间】:2010-06-11 12:45:38
【问题描述】:

我有以下代码

DataView dvTest= dsTest.Tables[1].Copy().DefaultView;

(巨大的)数据集 dsTest 的副本是否会保留在内存中,或者默认情况下会被垃圾收集?

它是否将整个数据集复制到内存中? GC什么时候发生?

【问题讨论】:

    标签: c# memory-management garbage-collection


    【解决方案1】:

    这实际上可能是两个问题:1) 匿名对象生命周期,以及 2) 数据集生命周期。

    for 1) - 只要没有对对象的引用,它就有资格被垃圾回收,就像“命名”对象一样。

    for 2) 数据表的默认视图具有对表的引用,因此数据表将保留在内存中,直到您不再持有对视图的引用(或任何行等 - 任何引用数据集的内容)。

    【讨论】:

      【解决方案2】:

      它很可能会挂起,因为DefaultView 引用的对象本身持有对从Copy 返回的对象的引用。当然,一旦它变得无法访问,它最终会被收集起来。但是,至少,你的dvTest 会导致它持续一段时间。

      【讨论】:

        【解决方案3】:

        您正在复制 DataTable,然后通过 DefaultView 在 dvTest 中保存对它的引用,因此在 dvTest 超出范围之前不会对其进行垃圾收集。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 2016-10-03
          • 1970-01-01
          • 2010-10-22
          • 2015-11-05
          • 2013-12-29
          相关资源
          最近更新 更多