我最近回答了如何在 C# 中向数组添加元素?当我提出使用类的替代解决方案时List
,我提醒自己还有一个类叫做ArrayList
.
在比较ArrayList和List的文档时,在这些文章的某些部分中它说:
“ArrayList 类旨在保存异构对象集合。但是,它并不总是提供最佳性能。”
并且
“List 类在大多数情况下表现最好,并且是类型安全的。”
然后文章List
试图解释为什么它表现List
更好,但这是我不明白的部分。它的字面意思是:
“对于 List,如果一个值类型用于类型 T,编译器会专门为该值类型生成 List 类的实现。这意味着 List 对象的列表元素不必在元素可以被装箱之前被装箱用过的。”
“对于一个列表,如果一个类型用于列表中的类型,编译器会专门为该类型值生成一个 List 类的实现。这意味着 List 对象的列表元素不必在它之前被封装可以使用。”
*我免费翻译
ArrayList 和 List 之间的真正区别是什么,为什么说 List 具有更好的性能?
PS:+10 布朗尼点任何人告诉我该段中的“盒装”应该理解什么,事实是我不能很好地翻译它。编辑:Flxtr 获得了布朗尼积分。
ArrayList
是自 C# 版本 1 和添加泛型之前的 .NET Framework 以来创建的类,而List<T>
自 C# 2、.NET Framework 2.0 和 VB.NET 2008 (8.0) 起取代它的类。主要区别在于一个实例
ArrayList
允许将多种类型添加到集合中。例子:
C#
VB
虽然它
List<T>
需要在实例化时定义列表元素的类型C#
VB
关于性能,区别在于装箱和拆箱
装箱是指如果要将引用类型的值(例如
int
,char
,float
,double
, ... 等)包装在引用中,则将其分配给类型的变量或参数object
。拆箱是指相反的过程,即在一个类型为引用类型的变量中获取对象的值。问题在于,这种装箱和拆箱过程发生在
ArrayList
添加或获取值的情况下。例子:
C#
VB
此过程需要执行时间,因此它比一般情况慢。
在
List<T>
此过程的一般情况下,它不存在,因为编译器为确切的数据类型生成代码(在这种情况下int
)并且不需要任何类型的转换。C#
VB
我建议您始终使用
List<T>
真相,我不知道使用它是否方便ArrayList
,因为虽然它没有被标记为过时,但实际上它已不再使用。基本上,每次保存/访问数组元素时,ArrayList 都需要装箱和拆箱。这是因为 ArrayList 存储了对 object 类型对象的引用,所以它需要不断地执行 cast 任务。
另一方面, List 不需要执行该任务,因为编译器实现了一个具体的(专门的?)列表供类型 T 使用。出于这个原因,它也更安全(尽管它也不能确保眼睛排序)。
区别可以这样理解:
通过声明 List,您可以为它分配一个类型(字符串、整数、布尔值),并且在添加元素时,它是一个将特定类型的值分配给内存扇区的过程。
相反,ArrayList 将其接收到的信息转换为一个全新的对象,然后再为 arrayList 中的每个项目分配内存空间(装箱)等等。阅读它时,您不仅要从 RAM 空间中获取它,还要“创建”它及其所有属性。消耗大量资源
List(Of T) 类 -T 指的是 Type(固定类型)- 非常强大。它最大的特点之一是实现了 IEnumerable(Of T) 接口,它允许访问许多方法。使用 ToArray 方法可以轻松地将此类的对象转换为数组。我们可以在 MSDN 上的List(Of T)阅读有关此类的 MSDN 文档
List(Of T) 的一个重要优点是该类的对象可以成为 LINQ 语言查询的一部分,允许我们将一种类型的对象列表转换为另一种类型的对象列表或转换为统计对象作为一个查询。列表,最后,最大,最小... LINQ