2008-12-24 49 views
44

我看到乔恩在Initialize generic object with unknown type这个答复:的ArrayList VS列表<object>

如果你想有一个单一的集合 包含多个不相关类型 值的,但是,你将不得不使用 List<object>

我并没有比较ArrayListList<>,但是ArrayListList<object>,因为两者都会暴露类型的元素10。在这种情况下使用其中一种会有什么好处?

编辑:这里没有关注类型安全,因为这两个类都暴露了object作为它的项目。仍然需要从object投射到所需的类型。除了类型安全以外,我更感兴趣。

编辑:谢谢Marc Gravell和肖恩的答案。对不起,我只能选择1作为答案,所以我会投两个。

回答

69

您可以直接与List<object>使用LINQ扩展方法,但不能与ArrayList,除非你(VS IEnumerable感谢IEnumerable<object>)注入Cast<object>()/OfType<object>。即使你不需要类型安全等,这也是值得的。

速度大致相同;结构仍然会被装箱等 - 所以没有什么别的可以将它们分开。除了我倾向于将ArrayList视为“oops,有人正在编写遗留代码...”;-p

-4

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

+1

很显然,我不是指类型安全在这里 – faulty 2008-12-24 09:47:13

5

是的,除了类型安全外,泛型集合实际上可能更快。

从MSDN(http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx

System.Collections.Generic 命名空间包含接口和定义一般 集合,它允许用户创建 强类型集合是 提供更好的 类类型安全和 表现比非通用强烈 类型集合。

+2

`名单`不会给你太多的改进在使用这些改进的`ArrayList`大多数键入安全和性能的方式是针对`名单 `T是除了'object`之外的任何东西。 – Brian 2011-02-10 21:15:08

38

使用List<object>的一大好处是,现在大部分代码都是使用泛型类/接口编写的。我怀疑现在大多数人会写一种采用IList<object>而不是IList的方法。由于ArrayList未实现IList<object>,因此您将无法在这些场景中使用数组列表。

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

+0

这是一个我没有想到的角度,很好的捕捉。 – 2008-12-24 10:18:18

11

在这种情况下,ArrayListList<Object>然后你不会注意到速度上的任何差异。实际可用的方法在.NET 3.5和计数扩展方法上可能存在一些差异,但这与ArrayList在某种程度上被弃用有关。

1

做一些基准测试,您将知道哪些性能最好。我很抱歉,差别非常小。

+0

其实我不知道这个问题是关于性能的,但这是一个很好的观点。我的猜测是arraylist perf会因为额外的拳击,拆箱而变得更糟。 – 2010-10-08 00:56:20

相关问题