2010-07-24 54 views
20

最近我问了一个关于SO的问题,提到了可能使用c#ArrayList解决方案。有人评论说使用数组列表是不好的。我想更多地了解这一点。我之前从来没有听说过关于数据列表的这个声明。 可以sombody救上来的可能性能问题,以加快对使用的ArrayListArrayList有什么错误?

C#。 .NET-2

+2

忽略任何性能问题,我不能想到一个情况下,你更喜欢一个ArrayList,因为上一个通用的一个2.0。 – 2010-07-24 19:46:27

+0

即使您需要的对象的列表,你可以使用列表 recursive 2010-07-24 19:47:50

+5

@DOK - 泛型的.Net中引入2.0 – STW 2010-07-24 19:48:52

回答

36

与ArrayList中的主要问题是使用object - 这意味着你必须转换为从无论你是封装。它是泛型的前几天剩下的时间,可能只是为了向后兼容。

您没有使用ArrayList的类型安全性,您使用泛型列表。性能问题是需要将对象转换回原始(或者有隐式装箱)。引用时放时到ArrayList和拆箱将盒装 - 无论你使用一个值类型

隐拳击会发生。

问题不仅在于性能,还在于可读性和正确性。自泛型进来以来,这个对象已经过时,只会在.NET 1.0/1.1代码中需要。

+4

类型安全也 – 2010-07-24 19:46:13

+0

@俄罗斯凸轮 - 感谢您的评论。答更新你评论;) – Oded 2010-07-24 19:48:58

2

除了性能问题,它是从运行时移动的错误编译时间的问题。从ArrayList中检索到的铸造对象必须在运行时发生,并且在执行期间会发生任何类型的错误。使用通用的List<>在编译期间检查所有类型。

+2

这是一个性能问题,以及...使用列表代替的ArrayList在它整型 – 2010-07-24 19:53:50

+0

大的时候性能提升。 – tster 2010-07-24 19:58:35

+0

这不是一个性能问题。然而,性能问题是答案的一部分。 – AMissico 2010-07-24 20:07:33

3

通用List<T>是优选的,因为它是通用的,这提供了额外的类型信息和消除了需要盒/拆箱值类型添加到它。

+0

@DOK - '名单'存在于.NET 2.0 – Lee 2010-07-24 19:49:49

+0

@DOK,.NET 2.0泛型了。 – 2010-07-24 19:51:19

+0

是否有与vb.net集合类型相同的泛型,它允许迭代器删除当前项目(假设项目的内容包含标识关键字的信息)?字典将是一个很好的匹配,除了最后一点。 – supercat 2010-07-25 02:19:57

3

ArrayList不是泛型类型,因此它必须将所有放置在其中的项目存储为对象。这有两个原因是不好的。首先,当在ArrayList中放入值类型时,您会强制编译器将值类型放入可能代价高昂的引用类型中。其次,你现在必须将你从数组列表中拉出的所有东西都施放。这是不好的,因为你现在需要确定你知道那里有什么对象。

List避免了这些问题,因为它是用适当的类型构造的。 例如:

List<int> ints = new List<int>(); 
ints.Add(5); //no boxing 
int num = ints[0]; // no casting 
13

如果你存储的值类型(整数,浮点,双等 - 或任何结构),ArrayList中会造成每个存储装箱和拆箱的每一个元素访问。这可能会对性能产生重大影响。

另外,ArrayList完全没有类型安全性。由于所有内容都是以“对象”的形式存储的,因此作为开发人员,您需要承担额外的负担,以确保其安全。

另外,如果你想要存储对象的行为,你总是可以使用List<object>。这对ArrayList没有任何不利之处,它有一个很大的优点:它使你的意图(存储一个无类型的对象)从一开始就清楚。

ArrayList真的只存在,且只能被用于.NET 1.1的代码。在.NET 2 +中真的没有理由使用它。