2011-03-18 88 views
13

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

public class List { 

    private Array _array; 

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

@Lasse V. Karlsen:如果你填充一个包含很多值的列表,可以很好地知道重复使用该列表是否可能导致更多的内存开销(通过保持数组),或者更多的性能开销(通过重新调整数组大小)。 – StriplingWarrior 2011-03-19 18:06:52

回答

15

所示(使用.net反射):

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

正如你看到的,它只是清除同一阵列。它可能假设,如果您重复使用相同的列表,您可能需要使用大致相同数量的数据重新填充它。如果你想释放数组,你需要创建一个新的List实例。

7

作为.NET 4.0,它执行以下操作:

  1. 零点出背衬阵列与Array.Clear呼叫。这有效地使其成为O(n)操作。
  2. 将尺寸设置为0.
  3. 递增内部版本号,以便活动的枚举员将抛出InvalidOperationExceptions如果对它们调用MoveNext
11

MSDN

计数被设置为0,并从 集合的元素 其他对象的引用也被释放。

容量保持不变。要重置清单的容量 ,请直接调用 TrimExcess方法或设置Capacity 属性。减少容量将重新分配内存,并将列表中的所有元素复制到 。 修剪空列表将列表的容量设置为 容量。

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

+1

+1,RTFM再一次是正确的答案。 – 2011-03-18 22:12:04