清除私人收藏或将其设为空?

时间:2012-07-30 07:54:18

标签: c# collections garbage-collection null

我有一个可变类,里面有一个私有的List<T>字段。在我班级的Reset()方法中,我应该使用其Clear()方法清除列表还是只为其字段指定一个新列表?请注意,该列表不是公共的,仅供类本身使用。因此,分配新列表应该使旧的列表无法访问。自Clear()方法is an O(n) operation以来,我想知道仅仅为其分配新列表的缺点是什么。

3 个答案:

答案 0 :(得分:5)

我唯一能想到的缺点是,如果你需要再次使用这个列表,你必须为它分配新的空间。

取消它只会使列表及其内容(假设没有其他参考)符合GC的条件。清除它会删除项目,但会分配内存。

就我个人而言,即使我再次需要它,我也倾向于将其归零,尺寸将完全改变。

更新:与以下评论相关,您声明这些对象将在对象池中进行管理。我建议创建一个小的性能分析控制台应用程序来获得最终答案。现在讨论的步骤是实现的具体细节和对象池的预期用法,这可能很容易改变答案。

一般来说,如果你的列表长度变化不大且总是需要,我会使用Clear来避免为列表分配新的内存。如果列表长度容易发生很大的变化,或者使用有时很少 - 我宁愿将其归零,以便通过列表的惰性实例化来回收内存并获得一些小的好处。

答案 1 :(得分:0)

那么为什么空呢?这将为你做到这一点,让旧列表留在堆上进行垃圾收集,而访问列表的现有方法可以继续在新的空列表上运行:

this.FooList = new List<Foo>();

答案 2 :(得分:0)

Reset调用之后,我会将对象保持在调用构造函数后的状态。

如果您的构造函数创建了一个新的空List,那么就这样做。如果不是null