【问题标题】:How is List.Clear() implemented in C#?List.Clear() 在 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:如果您使用大量值填充列表,那么很高兴知道重用该列表是否会导致更多内存开销(通过保留数组),或更多的性能开销(需要重新调整数组大小)。

标签: c# .net arrays list memory


【解决方案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 开始,它执行以下操作:

      1. 使用Array.Clear 调用将支持数组清零。这有效地使其成为 O(n) 操作。
      2. 将大小设置为 0。
      3. 增加内部版本号,以便活动枚举器在调用MoveNext 时将抛出InvalidOperationExceptions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 2018-10-31
        • 2011-03-05
        • 2018-08-24
        • 1970-01-01
        • 2011-04-07
        • 2020-08-17
        相关资源
        最近更新 更多