List.Clear() 在 C# 中是如何实现的?
Posted
技术标签:
【中文标题】List.Clear() 在 C# 中是如何实现的?【英文标题】:How is List.Clear() implemented in C#? 【发布时间】:2011-07-18 12:07:46 【问题描述】:我假设它使用一个数组来实现 List。 List.Clear()
是如何实现的?
它实际上是清理数组还是只是为这个列表创建一个新数组?
public class List
private Array _array;
public void Clear1 ()
_array.length = 0;
public void Clear2 ()
_array = new Array();
【问题讨论】:
@Lasse V. Karlsen:如果您使用大量值填充列表,那么很高兴知道重用该列表是否会导致更多内存开销(通过保留数组),或更多的性能开销(需要重新调整数组大小)。 【参考方案1】:像这样(使用 .NET Reflector):
public void Clear()
if (this._size > 0)
Array.Clear(this._items, 0, this._size);
this._size = 0;
this._version++;
如您所见,它只是清除了同一个数组。它可能假设如果您重用相同的列表,您可能希望用大致相同数量的数据重新填充它。如果要释放数组,则需要创建一个新的 List 实例。
【讨论】:
【参考方案2】:MSDN:
Count 设置为 0,并且引用 来自元素的其他对象 收藏品也发布了。
容量保持不变。重置 列表的容量,调用 TrimExcess 方法或设置容量 直接属性。减少 容量重新分配内存和副本 List 中的所有元素。 修剪一个空列表设置 列表容量为默认值 容量。
这个方法是一个 O(n) 操作, 其中 n 是计数。
【讨论】:
【参考方案3】:从 .NET 4.0 开始,它执行以下操作:
-
使用
Array.Clear
调用将支持数组清零。这有效地使其成为 O(n) 操作。
将大小设置为 0。
增加内部版本号,以便活动枚举器在调用MoveNext
时将抛出InvalidOperationExceptions
。
【讨论】:
以上是关于List.Clear() 在 C# 中是如何实现的?的主要内容,如果未能解决你的问题,请参考以下文章