我有以下代码
DataView dvTest= dsTest.Tables[1].Copy().DefaultView;
(巨大的)数据集dsTest的副本是否会保留在内存中,还是默认情况下会收集垃圾?
是否将整个数据集复制到内存中? 当GC发生时?
答案 0 :(得分:3)
这实际上可能是两个问题:1)匿名对象生命周期,以及2)数据集生命周期。
for 1) - 只要没有对象的引用,它就有资格被垃圾收集,就像“命名”对象一样。
for 2)数据表的默认视图具有对表的引用,因此数据表将保留在内存中,直到您不再持有对视图的引用(或任何行等 - 引用数据集的任何内容)。 / p>
答案 1 :(得分:2)
由于DefaultView
引用的对象本身拥有对Copy
返回的对象的引用,因此它很可能会挂起。当然,一旦它变得无法到达,它最终将被收集。但是,至少,你的dvTest
会导致它持续一段时间。
答案 2 :(得分:0)
您正在复制DataTable,然后通过DefaultView在dvTest中保存对它的引用,因此在dvTest超出范围之前不会对它进行垃圾回收。