.net的ArrayList.Clear是否会释放内存?

7

我有一个非常大的ArrayList列表,我想要对其进行清空并重复使用。如果我清空它,之前使用的内存会被释放吗?

我还应该提到,这个ArrayList列表是一个类的私有只读字段,在第一次使用ArrayList列表后,该类仍然有很多活动工作要做。因此,我不能等待类超出范围后进行垃圾回收。

Clear方法是否足够快?或者我应该销毁并创建一个新的ArrayList列表?

问题更新:

如果我声明了如下的字段(感谢Jon的建议)

    /// <summary>
    /// Collection of tasks.
    /// </summary>
    private List<Task> tasks = new List<Task>();

然后我填充它...(大量填充)

现在,如果不清除和修剪,我能否直接调用:

tasks = new List<Task>(); 

这个推荐吗?

+1 给 Jon,因为他已经涵盖了这个问题。然而,Clear 方法并不会真正释放内存 - 只有垃圾回收器才能做到。正确编写的 IDisposable 对象在其 Dispose 实现中也会释放非托管内存 - 如果适用的话。也许我只是过于追求精确了 :) - Andras Zoltan
好观点Andras,但我认为将该内存准备好进行垃圾回收就足够了。 - JL.
2个回答

16

根据您的意图选择适合的操作。如果您确实需要一个新列表,请创建一个新的列表。如果您在概念上想要重用同一列表,请调用Clear方法。

ArrayList 的文档确实说明了Clear方法保留了原始容量 - 因此,您仍将拥有一个大数组,但它将充满空值,而不是对先前元素的引用:

Capacity属性保持不变。要重置ArrayList的容量,请调用TrimToSize方法或直接设置Capacity属性。将空的ArrayList修剪到大小将会将其容量设置为默认容量。

顺便问一下,您使用ArrayList而不是List<T>是否有特殊原因?


嗨Jon,回答你的问题,我猜是缺乏知识,使用List<T>有什么好处? - JL.
1
@JL:通用集合通常更好:在编译时类型安全,使用更方便(无需转换),对值类型更有效率...你使用的是哪个版本的.NET?(它们只在.NET 2.0及以上版本中可用。) - Jon Skeet
上一个问题:如果我有一个非常大的List<T>,在使用它后将其设置为新的List<T>(显然T =我的类)- 这会给我一个新的List<T>,同时释放以前使用的内存进行垃圾回收吗? - JL.
1
如果没有其他引用指向先前的列表,那么它将变为垃圾收集的候选对象。当然,这并不会强制启动垃圾回收器,但通常这是件好事。 - Jon Skeet

3

如果想实际释放内存,可以将其设置为null并调用垃圾回收器。然后创建一个新的ArrayList。如果您将其设置为null然后创建一个新的ArrayList,当需要更多内存时,它最终会被垃圾回收。此外,我推荐使用泛型集合。自从我使用过ArrayList以来已经很长时间了。


1
我同意使用 GC.Free() 的观点,但我会尽量避免使用它。然而,在某些情况下确实需要使用它。我已经阅读过一些关于在XNA游戏场景之间使用它以避免在游戏运行时错误地进行垃圾回收的技巧......它有其用途。 - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接