何时在.NET中使用Array()而不是Generic.Lists?

6

在.NET中,何时使用数组而不是通用列表(List(of T))?

我一直很难看出数组相比通用列表有什么优势,但感觉可能有些地方我理解得不够透彻。性能是其中一个潜在的瓶颈吗?

谢谢。


任何性能损失可能都是微不足道的。 - Mike Dunlavey
5个回答

3

如果你正在使用给定类型的固定数量的对象,那么使用List类会带来一些性能上的损失,因为你不会使用它的任何功能。


3

我现在会毫不羞耻地复制粘贴我编辑过的答案,针对今天在这里提出的非常相似的问题:

我想指出的是,虽然数组具有协变性,但泛型列表没有。例如,类型为MyChildClass[]的数组可以轻松地转换为MyParentClass[],而List<MyChildClass>不能直接转换为List<MyParentClass>

如果您需要协变性,请使用数组、使用LINQ的Cast()方法或其他方式逐个转换每个项目。


或者等待具有协变性的C#4版本;-) - JoshBerke
Josh:正如Mark Gravell在我的原始回答中指出的那样:“C# 4不会为列表提供协变性 - 只有IEnumerable<T>(和一些委托)- 它要求严格的“in” xor “out”用法,而List<T>既有“in”又有“out”用法。” - Tamas Czinege
有趣,我不知道那个。数组协变的一个问题是,如果你有一个 MyParentClass[] 设置为 MyChildClass[],如果你尝试将 MySecondChild 类放入 MyParentClass 中,你会得到一个异常。这并不直观。 - JoshBerke
这是有关数组协变的更多信息:http://blogs.msdn.com/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array-covariance.aspx - JoshBerke

2

使用常规数组的另一个原因是在使用平台调用(执行非托管c/c++代码)时,但这仅适用于非常少量的应用程序。

另外,作为一条备注:如果数组的大小已知,但仍想使用通用列表,请不要忘记将大小传递给构造函数的容量参数。

例如:

List<int> lst = new List<int> (100);

否则,该列表将以非常小的容量开始,并且需要几次分配新的内存块,而不是一次性地分配所需空间。

0
许多高级数据结构(包括List)在内部使用数组,这是在内存中存储原始序列的唯一方式 - 因此数组必须存在于编程语言中,否则您将无法拥有更高级别的数据结构。
我的观点是,除非必须这样做(例如因为您正在使用需要它的组件),否则永远不要使用数组 - 特别是不要编写返回数组或接受数组作为参数的代码,这样您就不会强制他人也使用数组。
唯一的例外情况(在我看来)是当您需要一个已知固定大小的集合作为局部变量时,使用其他东西似乎是浪费的。

0
如果你想要缓存一定数量的数据,使用数组。否则,使用泛型列表...它们更易于使用,提供更大的灵活性,并且是类型化的(不需要装箱/拆箱)...就这么简单。此外,数组长度固定,而列表可以是可变的,可以在任何时候更改。为什么要使用泛型列表而不是数组的原因可以继续列举。数组只是个麻烦。而且老实说,使用列表与使用数组相比所带来的性能损失可能会被争论得淋漓尽致。

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