2011-03-18 27 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