2013-02-18 95 views
-4

最近我聽說ArrayListSystem.Collections是不是安全,是什麼問題? 安全是:可能有錯誤,或可能有不良行爲。爲什麼C#中的ArrayList不安全?

+1

您是不是要找「類型安全」? – 2013-02-18 22:15:56

+2

你的安全是什麼意思?類型安全嗎?線程安全? – 2013-02-18 22:15:58

+3

[ArrayList有什麼錯誤?](http:// stackoverflow。com/questions/3326599/whats-wrong-with-an-arraylist) – Asik 2013-02-18 22:21:52

回答

8

他們是不是安全的,因爲它們不是強類型。這意味着你在編譯時不知道可以存儲在裏面的對象的類型。您還需要將其轉換爲實際類型,這意味着只有在運行時纔會出現錯誤。您應該使用泛型和強類型等效List<T>

看看下面的例子,你需要投從ArrayList中實際類型得到的結果:

ArrayList list = new ArrayList(); 
list.Add(123); 
int element = (int)list[0]; 

事情會變得極其錯誤的,如果你施放了錯誤的類型和程序將只在運行時崩潰。

而用List<T>你不需要這個施法,你會得到編譯時的安全性:

List<int> list = new List<int>(); 
list.Add(123); 
int element = list[0]; 

現在,如果通過安全你的意思是線程安全(相對於類型安全),那麼這是一個完全不同的東西。 ArrayListList<T>都不是線程安全的類。這意味着如果您嘗試從另一個線程修改它的一個線程讀取集合,則可能會遇到異常或損壞的數據。在.NET 4.0中,已經引入了thread safe collections

9

它不是強類型也不是本質上就是線程安全的*。有更好的選擇支持強類型,例如System.Collections.Generic.List<T>

ArrayList不支持編譯時類型檢查,可以引入裝箱/拆箱開銷,並且一般來說比較麻煩。它是在泛型之前引入的,它消除了上述問題。

*精度的利益,ArrayList中也暴露出Synchronized屬性,它提供了線程安全(see notes at end of article)的水平。

2

這是不安全的,因爲以下在運行時出現故障:

myArrayList.Add(new Banana()); 
Airplane obj = (Airplane)myArrayList[0]; 

編譯器無法檢測到您正在嘗試使用一個香蕉,飛機,因爲ArrayList的需要,只返回object S,和一切在.NET中是一個object

ArrayList基本上已經被替換爲System.Collections.Generics.List(T)因爲.NET 2.0;它是一個更強類型的替代品,不允許出現這種錯誤。

相關問題