1

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

在 Form2 中制作硬拷贝后,我想清除与 Form1 中的集合相关的所有内容。设Col1为 Form1 中集合的标识符。

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

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

4

3 回答 3

5

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

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

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

希望能帮助到你...

于 2012-07-16T14:25:55.703 回答
2

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

正如 Tim Schmelter 指出的那样,从表格 2 中添加对列表“X”的引用不会创建副本 - 只会创建对 X 的新引用。从表格 2 中删除对 X 的引用也不应该减少内存,因为 X 仍然存在- 指向它的指针只会少一件事。但是,如果您确实创建了列表的硬拷贝,那么您确实可以通过删除所有对原始列表及其包含的数据的引用来节省一些内存。(但是请注意,深度复制列表并不总是直截了当......

至于使用天气clear()TrimExcess(),我通常会假设这些是内置的,并期望它们表现得相当好。无论如何,我非常怀疑它们是否会以任何显着方式影响您的代码速度。

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

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

于 2012-07-16T14:35:21.910 回答
1

MSDN

要将 List 重置为其初始状态,请在调用 TrimExcess 方法之前调用 Clear 方法。修剪空列表会将列表的容量设置为默认容量。

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

于 2012-07-16T14:29:23.710 回答