匿名对象的内存范围 - C#.Net

时间:2010-06-11 12:45:38

标签: c# memory-management garbage-collection

我有以下代码

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

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

是否将整个数据集复制到内存中? 当GC发生时?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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