8

我有一个可变类,里面有一个私有List<T>字段。在Reset()我的类的方法中,我应该使用它的Clear()方法清除列表还是只为其字段分配一个新列表?请注意,该列表不是公开的,仅由类本身使用。因此,分配一个新列表应该使旧列表无法访问。由于该Clear()方法是一个 O(n) 操作,我想知道仅在其上分配一个新列表的缺点是什么。

4

3 回答 3

7

我能想到的唯一缺点是,如果您需要再次使用该列表,则必须为其分配新空间。

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

就我个人而言,我倾向于将它归零,因为即使我再次需要它,大小也会完全改变。

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

一般来说,如果您的列表长度变化不大并且总是需要,我会Clear避免为列表分配新内存。如果列表长度可能会发生很大变化,或者有时使用很少 - 我倾向于将其归零以回收内存并通过列表的延迟实例化获得一些小好处。

于 2012-07-30T07:58:28.647 回答
0

那么为什么为空呢?这将为您解决问题,让旧列表留在堆上进行垃圾收集,而访问该列表的现有方法可以继续在新的空列表上运行:

this.FooList = new List<Foo>();
于 2012-07-30T08:01:20.270 回答
0

Reset调用之后,我会让对象处于调用构造函数之后的相同状态。

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

于 2012-07-30T08:10:34.227 回答