最近我在 SO 上提出了一个问题,其中提到可能使用 C# 的 ArrayList 来解决。有人评论说使用 ArrayList 是不好的。我想更了解一下此事。我以前从未听说过关于 ArrayList 的这种说法。
C#、.NET-2
最近我在 SO 上提出了一个问题,其中提到可能使用 C# 的 ArrayList 来解决。有人评论说使用 ArrayList 是不好的。我想更了解一下此事。我以前从未听说过关于 ArrayList 的这种说法。
C#、.NET-2
ArrayList的主要问题是它使用object
- 这意味着你必须对你所封装的任何东西进行强制类型转换。这是在泛型出现之前的遗留问题,可能只是为了向后兼容。
与通用列表相比,ArrayList没有类型安全性。性能问题在于需要将对象强制转回原始类型(或发生隐式装箱)。
每当使用值类型时,都会发生隐式装箱 - 当放入ArrayList中时,它将被装箱,当被引用时则会取消装箱。
问题不仅在于性能,还包括可读性和正确性。自从泛型出现以来,这个对象就已经过时了,只有在.NET 1.0/1.1代码中才需要它。
如果你要存储值类型(int,float,double等或任何结构体),使用ArrayList会导致每次存储时的装箱和每次访问元素时的拆箱。这可能对性能造成重大影响。
此外,ArrayList完全缺乏类型安全性。由于所有内容都被存储为"object",因此作为开发人员,你需要承担额外的责任来保证其安全。
此外,如果你希望存储对象的行为,你可以始终使用List<object>
。 这与ArrayList相比没有任何不利之处,并且它具有一个很大的(在我看来)优点:从一开始就清楚地表明了你的意图(存储未经类型定义的对象)。
ArrayList
实际上只存在于.NET 1.1代码中,并且应该仅用于那里。 在.NET 2+中真的没有使用它的理由。
ArrayList不是泛型类型,因此必须将放入其中的所有项都存储为对象。这有两个问题。首先,在将值类型放入ArrayList时,您会强制编译器将值类型装箱为引用类型,这可能很昂贵。其次,现在您必须对从数组列表中取出的每个对象进行强制转换。这很糟糕,因为现在您需要确保知道其中有哪些对象。
List避免了这些问题,因为它是使用正确的类型构建的。 例如:
List<int> ints = new List<int>();
ints.Add(5); //no boxing
int num = ints[0]; // no casting
通常使用泛型List<T>
,因为它是泛型的,提供了额外的类型信息,并且不需要对添加到其中的值类型进行装箱/拆箱。
List<T>
存在于 .net 2.0 中。 - Lee除了性能问题之外,这也是将错误从运行时移到编译时的问题。从 ArrayList
检索出来的对象转换必须在运行时发生,而任何类型错误都会在执行期间发现。使用泛型 List<>
,所有类型都在编译时进行检查。
所有的装箱和拆箱都可能很昂贵且易碎。微软在.NET 2.0泛型中在类型和性能方面进行了一些不错的改进。
以下是一些好的阅读材料:
值类型的装箱和拆箱:你需要知道什么? 在 http://www.c-sharpcorner.com/uploadfile/stuart_fujitani/boxnunbox11192005055746am/boxnunbox.aspx 上
性能:ArrayList vs List<> 在 http://allantech.blogspot.com/2007/03/performance-arraylist-vs-list.html 上