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# 中是如何实现的?的主要内容,如果未能解决你的问题,请参考以下文章

字符串在 C# 中是如何工作的? [关闭]

C#中List<List<string>>要怎么处理?

请问啥是数据管道,在c#中是怎么具体应用的?

c#中是wpf好用还是窗体好用

java中如何将list集合清空

Python list.clear复杂性[重复]