如何在C#中实现List.Clear()?

时间:2011-03-18 21:42:30

标签: c# .net arrays list memory

我假设它使用数组来实现List。 List.Clear()如何实施? 它实际上是清理数组还是为这个列表创建一个新数组?

public class List {

    private Array _array;

    public void Clear1 () {
        _array.length = 0;
    }
    public void Clear2 () {
        _array = new Array();
    }
}

3 个答案:

答案 0 :(得分:15)

像这样(使用.NET Reflector):

public void Clear()
{
    if (this._size > 0)
    {
        Array.Clear(this._items, 0, this._size);
        this._size = 0;
    }
    this._version++;
}

如您所见,它只是清除相同的数组。它可能假定如果您重复使用相同的列表,您可能希望使用大致相同数量的数据重新填充它。如果要释放阵列,则需要创建一个新的List实例。

答案 1 :(得分:13)

MSDN

  

Count设置为0,并引用   来自元素的其他对象   收集也已发布。

     

容量保持不变。重置   列表的容量,调用   TrimExcess方法或设置容量   财产直接。减少   容量重新分配内存和副本   列表中的所有元素。   修剪一个空列表设置   列表的容量为默认值   容量。

     

此方法是O(n)操作,   其中n是计数。

答案 2 :(得分:7)

从.NET 4.0开始,它执行以下操作:

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