2010-01-13 113 views
7

我有一個人口稠密的arraylist,我想清除和重用。如果我清除它將釋放以前使用的內存?.net不會ArrayList.Clear釋放內存?

我還應該提到,arraylist是一個類的私人只讀字段,在我第一次使用arraylist之後,仍然有很多活躍的工作要做。所以我不能等到課程結束之後垃圾回收。

清除方法是否足夠快?或者我應該銷燬並創建一個新的數組列表?

問題更新:

如果我有場聲明如下(感謝Jon的建議)

/// <summary> 
    /// Collection of tasks. 
    /// </summary> 
    private List<Task> tasks = new List<Task>(); 

然後我來填充它......(重)現在

如果代替清理它和修剪,我可以撥打:

tasks = new List<Task>(); 

這會被推薦?

+0

對喬恩來說+1是真的。但是,Clear無論如何都不會真的釋放內存 - 只有垃圾收集器纔會這樣做。 正確編寫的IDisposable對象在Dispose的實現中也釋放非託管內存 - 如果適用的話。 也許我只是迂腐:) – 2010-01-13 22:15:42

+0

好點安德拉斯,但我認爲它足以讓那個mem準備好垃圾收集。 – 2010-01-13 22:33:55

回答

16

做哪一個更好地表達你的意圖。 實際上想要一個新的列表嗎?如果是這樣,請創建一個新的。如果您在概念上想要重複使用相同的列表,請致電Clear

ArrayList的文檔中則狀態Clear保留原始容量 - 所以你仍然將有一個大陣,但它會是全空的,而不是參照前面的元素:

Capacity保持不變。要重置 的容量ArrayList,請撥 TrimToSize或直接設置Capacity 屬性。修剪空的 ArrayListArrayList的容量設置爲默認容量。

你使用ArrayList而非List<T>的方式的原因嗎?

+0

嗨喬恩,回答你的問題缺乏知識我猜,使用列表有什麼好處? – 2010-01-13 20:08:26

+1

@JL:泛型集合通常更好:在編譯時安全類型,更易於使用(不需要強制轉換),更有效的值類型......您使用的是什麼版本的.NET? (他們只能從.NET 2.0開始使用。) – 2010-01-13 20:10:14

+0

最後問:如果我有一個重填充列表和使用後,其值設置爲新的列表(顯然其中T =我的課) - 將這個給我一個新的列表,並在同一時間釋放先前使用內存垃圾收集? – 2010-01-13 20:19:44

3

如果您希望內存實際上是free'd,請將其設置爲null並調用垃圾回收器。然後創建一個新的ArrayList。如果將其設置爲空,然後創建一個新的,則在需要額外內存時,它最終會收集垃圾。另外,我是第二個通用集合。自從我使用ArrayList以來已經很久了。

+1

我同意GC.Free(),我避免它。不過,我已經看到了必要的情況。我已經閱讀過在場景之間在XNA遊戲中使用它的技巧,以避免在遊戲中錯誤的時間收集垃圾......它有它的用處。 – Nate 2010-01-13 20:40:03