2013-02-18 91 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;它是一个更强类型的替代品,不允许出现这种错误。

相关问题