2010-07-24 23 views
20

最近我問了一個關於SO的問題,提到了可能使用c#ArrayList解決方案。有人評論說使用數組列表是不好的。我想更多地瞭解這一點。我之前從來沒有聽說過關於數據列表的這個聲明。 可以sombody救上來的可能性能問題,以加快對使用的ArrayListArrayList有什麼錯誤?

C#。 .NET-2

+2

忽略任何性能問題,我不能想到一個情況下,你更喜歡一個ArrayList,因爲上一個通用的一個2.0。 – 2010-07-24 19:46:27

+0

即使您需要的對象的列表,你可以使用列表 recursive 2010-07-24 19:47:50

+5

@DOK - 泛型的.Net中引入2.0 – STW 2010-07-24 19:48:52

回答

36

與ArrayList中的主要問題是使用object - 這意味着你必須轉換爲從無論你是封裝。它是泛型的前幾天剩下的時間,可能只是爲了向後兼容。

您沒有使用ArrayList的類型安全性,您使用泛型列表。性能問題是需要將對象轉換回原始(或者有隱式裝箱)。引用時放時到ArrayList和拆箱將盒裝 - 無論你使用一個值類型

隱拳擊會發生。

問題不僅在於性能,還在於可讀性和正確性。自泛型進來以來,這個對象已經過時,只會在.NET 1.0/1.1代碼中需要。

+4

類型安全也 – 2010-07-24 19:46:13

+0

@俄羅斯凸輪 - 感謝您的評論。答更新你評論;) – Oded 2010-07-24 19:48:58

2

除了性能問題,它是從運行時移動的錯誤編譯時間的問題。從ArrayList中檢索到的鑄造對象必須在運行時發生,並且在執行期間會發生任何類型的錯誤。使用通用的List<>在編譯期間檢查所有類型。

+2

這是一個性能問題,以及...使用列表代替的ArrayList在它整型 – 2010-07-24 19:53:50

+0

大的時候性能提升。 – tster 2010-07-24 19:58:35

+0

這不是一個性能問題。然而,性能問題是答案的一部分。 – AMissico 2010-07-24 20:07:33

3

通用List<T>是優選的,因爲它是通用的,這提供了額外的類型信息和消除了需要盒/拆箱值類型添加到它。

+0

@DOK - '名單'存在於.NET 2.0 – Lee 2010-07-24 19:49:49

+0

@DOK,.NET 2.0泛型了。 – 2010-07-24 19:51:19

+0

是否有與vb.net集合類型相同的泛型,它允許迭代器刪除當前項目(假設項目的內容包含標識關鍵字的信息)?字典將是一個很好的匹配,除了最後一點。 – supercat 2010-07-25 02:19:57

3

ArrayList不是泛型類型,因此它必須將所有放置在其中的項目存儲爲對象。這有兩個原因是不好的。首先,當在ArrayList中放入值類型時,您會強制編譯器將值類型放入可能代價高昂的引用類型中。其次,你現在必須將你從數組列表中拉出的所有東西都施放。這是不好的,因爲你現在需要確定你知道那裏有什麼對象。

List避免了這些問題,因爲它是用適當的類型構造的。 例如:

List<int> ints = new List<int>(); 
ints.Add(5); //no boxing 
int num = ints[0]; // no casting 
13

如果你存儲的值類型(整數,浮點,雙等 - 或任何結構),ArrayList中會造成每個存儲裝箱和拆箱的每一個元素訪問。這可能會對性能產生重大影響。

另外,ArrayList完全沒有類型安全性。由於所有內容都是以「對象」的形式存儲的,因此作爲開發人員,您需要承擔額外的負擔,以確保其安全。

另外,如果你想要存儲對象的行爲,你總是可以使用List<object>。這對ArrayList沒有任何不利之處,它有一個很大的優點:它使你的意圖(存儲一個無類型的對象)從一開始就清楚。

ArrayList真的只存在,且只能被用於.NET 1.1的代碼。在.NET 2 +中真的沒有理由使用它。