ArrayList和List<object>的区别

54
我看到Jon在Initialize generic object with unknown type的回复中说道:

如果你想要一个集合来包含多个不相关类型的值,那么你必须使用List<object>

我不是在比较ArrayListList<>,而是在比较ArrayListList<object>,因为两者都会暴露出object类型的元素。在这种情况下,使用其中任何一种的好处是什么?

编辑:在这里并不关心类型安全,因为两个类都将object作为其项公开。仍然需要从object转换为所需的类型。我更感兴趣的是除了类型安全之外的任何内容。

编辑:感谢Marc Gravell和Sean的答案。抱歉,我只能选择一个答案,所以我会给两个人点赞。

6个回答

86

您可以直接使用LINQ扩展方法来处理 List<object>,但对于ArrayList而言,则需要注入Cast<object>() / OfType<object>(感谢IEnumerable<object>IEnumerable之间的差异)。即使您不需要类型安全等功能,这也相当有价值。

速度将大致相同;结构体仍然会被装箱等,因此没有太多其他区别。除了我倾向于视ArrayList为“糟糕,又有人在编写遗留代码了…”;-p


47

使用List<object>的一个重要好处是,现在大多数代码都是编写为使用泛型类/接口的。我认为现在大多数人会编写一个接受IList<object>而不是IList的方法。因为ArrayList没有实现IList<object>,所以你不能在这些情况下使用数组列表。

我倾向于将非泛型类/接口视为遗留代码,并尽可能避免使用它们。


11
在这种情况下,ArrayListList<Object> 之间的区别在速度上并不明显。它们之间可能存在一些实际可用的方法差异,特别是在 .NET 3.5 中增加了扩展方法,但这更多地与ArrayList有点过时有关,而不是其他方面的问题。

5

2
List<object>并不能在类型安全和性能方面带来太多的改进,与使用ArrayList相比。大多数这些改进都是针对List<T>而言,其中T除了object以外的任何类型。 - Brian

1

进行一些基准测试,你就会知道哪个表现最佳。我估计差异非常小。


其实我不确定这个问题是否与性能有关,但这是一个很好的观点。我猜ArrayList的性能会更差,因为需要额外的装箱和拆箱操作。 - Anonymous Type
@匿名用户:什么额外的装箱?ArrayListList<object>应该具有相同数量的装箱/拆箱。 - Brian
“一个单一的集合来包含多个不相关类型的值” - 我的理解是,当向List集合对象添加不同类型的值时,会发生装箱/拆箱,而使用ArrayList则不会。我想我对此是错误的。 - Anonymous Type

-5

List<>是ArrayList的类型安全版本。它将确保您在集合中获取相同的对象类型。


1
显然,我在这里并不是指类型安全。 - faulty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接