最近我問了一個關於SO的問題,提到了可能使用c#ArrayList解決方案。有人評論說使用數組列表是不好的。我想更多地瞭解這一點。我之前從來沒有聽說過關於數據列表的這個聲明。 可以sombody救上來的可能性能問題,以加快對使用的ArrayListArrayList有什麼錯誤?
C#。 .NET-2
最近我問了一個關於SO的問題,提到了可能使用c#ArrayList解決方案。有人評論說使用數組列表是不好的。我想更多地瞭解這一點。我之前從來沒有聽說過關於數據列表的這個聲明。 可以sombody救上來的可能性能問題,以加快對使用的ArrayListArrayList有什麼錯誤?
C#。 .NET-2
與ArrayList中的主要問題是使用object
- 這意味着你必須轉換爲從無論你是封裝。它是泛型的前幾天剩下的時間,可能只是爲了向後兼容。
您沒有使用ArrayList的類型安全性,您使用泛型列表。性能問題是需要將對象轉換回原始(或者有隱式裝箱)。引用時放時到ArrayList和拆箱將盒裝 - 無論你使用一個值類型
隱拳擊會發生。
問題不僅在於性能,還在於可讀性和正確性。自泛型進來以來,這個對象已經過時,只會在.NET 1.0/1.1代碼中需要。
類型安全也 – 2010-07-24 19:46:13
@俄羅斯凸輪 - 感謝您的評論。答更新你評論;) – Oded 2010-07-24 19:48:58
ArrayList不是泛型類型,因此它必須將所有放置在其中的項目存儲爲對象。這有兩個原因是不好的。首先,當在ArrayList中放入值類型時,您會強制編譯器將值類型放入可能代價高昂的引用類型中。其次,你現在必須將你從數組列表中拉出的所有東西都施放。這是不好的,因爲你現在需要確定你知道那裏有什麼對象。
List避免了這些問題,因爲它是用適當的類型構造的。 例如:
List<int> ints = new List<int>();
ints.Add(5); //no boxing
int num = ints[0]; // no casting
如果你存儲的值類型(整數,浮點,雙等 - 或任何結構),ArrayList中會造成每個存儲裝箱和拆箱的每一個元素訪問。這可能會對性能產生重大影響。
另外,ArrayList完全沒有類型安全性。由於所有內容都是以「對象」的形式存儲的,因此作爲開發人員,您需要承擔額外的負擔,以確保其安全。
另外,如果你想要存儲對象的行爲,你總是可以使用List<object>
。這對ArrayList沒有任何不利之處,它有一個很大的優點:它使你的意圖(存儲一個無類型的對象)從一開始就清楚。
ArrayList
真的只存在,且只能被用於.NET 1.1的代碼。在.NET 2 +中真的沒有理由使用它。
所有的拳擊和拆箱可能是昂貴和脆弱的。微軟在.NET 2.0泛型的鍵入和性能方面做了一些很好的改進。
這裏有一些很好寫着:
忽略任何性能問題,我不能想到一個情況下,你更喜歡一個ArrayList,因爲上一個通用的一個2.0。 – 2010-07-24 19:46:27
即使您需要的對象的列表,你可以使用列表
@DOK - 泛型的.Net中引入2.0 – STW 2010-07-24 19:48:52