.net List <t>修剪超额</t>

时间:2012-07-16 14:01:33

标签: c# collections garbage-collection dynamic-memory-allocation

考虑这种情况:Form1构建一个List对象,其中包含大量元素。然后,它必须通过参数将此集合传递给Form2。

我希望在Form2中对其进行硬拷贝后清除与Form1中的集合相关的所有内容。让 Col1 成为Form1中集合的标识符。

由于Col1是通过参数通过引用传递的,我正在调用 Col1.Clear()来清除它的元素,然后 Col1.TrimExcess()来将其实际大小减小到0,因此它不会跟踪大量的 null 值。

我的目的是尽快清除所有使用过的内存。 Col1.TrimExcess()应该清除所有使用过的内存,但我很好奇Col1 = null是否会在我(或大多数)情况下更好地工作?

3 个答案:

答案 0 :(得分:4)

我想调用Col1.Clear()来清除它的元素,然后调用Col1.TrimExcess() 将是一个更好的方法,因为Col1 = null将只取消引用列表,但它仍将在内存中,直到GC完成其工作。

调用Col1.Clear()将从列表本身取消引用列表中的项目,然后Col1.TrimExcess()将从列表中删除所有空元素。

因此,这将删除内存中所有内容的引用。

希望它有所帮助...

答案 1 :(得分:2)

我猜你正在这样做,所以你可以在form1中“准备”东西,然后将准备好的内容传递给Form2,以避免某种滞后或者其他什么,我是否正确?无论如何,有几个问题需要考虑:

正如Tim Schmelter所指出的那样,从表单2添加对列表“X”的引用不会创建副本 - 只是对X的新引用。从表单2中删除对X的引用也不应该减少内存,因为X仍然存在 - 指向它的指针只会少一件事。但是,如果您执行创建列表的硬拷贝,那么您可能确实通过删除原始列表及其包含的数据的所有引用来节省一些内存。 (但请注意,deep copying a list is not always straight foreward...

至于使用clear()TrimExcess()的天气,我通常会认为这些是有充分理由的,并期望它们表现得相当好。无论如何,我非常怀疑它们会以任何显着的方式影响代码的速度。

此外,如果你应该选择使用col = null,你最终会得到一个具有空值的变量(显然是...),而另一个选项最终会得到一个空的(但是非空的) )清单。如果我没有弄错,相当于将列表修剪为“手动”的零长度不是将其设置为null,而是将其指向新的(空)列表:col = new List(),但我怀疑是否会为您节省任何CPU周期。

简而言之,我建议你像开始一样继续,并使用内置方法。

答案 2 :(得分:1)

相应于MSDN

  

要将List重置为初始状态,请先调用Clear方法   调用TrimExcess方法。修剪一个空列表设置   列表的容量为默认容量。

所以我猜你的方法是正确的。