MyClass[] array; List<MyClass> list;
一个比另外一个更可取的状况是什么? 又为何呢? git
在大多数状况下,使用List
就足够了。 List
使用内部数组来处理其数据,并在向List
添加比其当前容量更多的元素时自动调整数组的大小,这使其比须要事先了解容量的数组更易于使用。 github
请参阅http://msdn.microsoft.com/zh-cn/library/ms379570(v=vs.80).aspx#datastructures20_1_topic5 ,以获取有关C#中列表的更多信息,或仅反编译System.Collections.Generic.List<T>
。 编程
若是须要多维数据(例如,使用矩阵或在图形编程中使用),则可能会改用array
。 数组
与往常同样,若是内存或性能成为问题,请对其进行衡量! 不然,您可能会对代码作出错误的假设。 性能
还没有说起的另外一种状况是,当一个项目具备大量项目时,每一个项目都由固定在一块儿的一束相关但独立的变量组成(例如,一个点的坐标或3d三角形的顶点)。 暴露场结构的数组将容许其元素“就地”被有效地修改,这是任何其余集合类型都不可能作到的。 因为结构的数组将其元素连续保存在RAM中,所以对数组元素的顺序访问会很是快。 在代码须要屡次顺序经过数组的状况下,结构数组的性能可能比数组或类对象引用的其余集合的性能高2:1; 此外,在适当位置更新元素的能力能够容许结构阵列赛过任何其余种类的结构集合。 优化
尽管数组不可调整大小,可是让代码存储数组引用以及正在使用的元素数量并不困难,并根据须要用更大的数组替换数组。 或者,能够轻松地为行为相似于List<T>
但暴露其后备存储的类型编写代码,从而令人们能够说MyPoints.Add(nextPoint);
或MyPoints.Items[23].X += 5;
。 请注意,若是代码尝试访问列表末尾以外的内容,后者不必定会引起异常,可是在概念上,用法与List<T>
很是类似。 编码
当集合自己的不可变性是客户端与提供者代码之间的合同的一部分(不必定是集合中项目的不可变性)而且IEnumerable不适合时, 应优先于List使用数组。 spa
例如, .net
var str = "This is a string"; var strChars = str.ToCharArray(); // returns array
显然,对“ strChars”的修改不会改变原始的“ str”对象,而与“ str”的基础类型的实现级知识无关。 设计
可是假设
var str = "This is a string"; var strChars = str.ToCharList(); // returns List<char> strChars.Insert(0, 'X');
在这种状况下,仅凭该代码片断尚不清楚insert方法是否将使原始“ str”对象发生突变。 它须要String的实现级别的知识才能进行肯定,这破坏了“按合同设计”方法。 对于String来讲,这没什么大不了的,可是在几乎全部其余状况下,这可能都是大问题。 将列表设置为只读确实有帮助,但会致使运行时错误,而不是编译时错误。
我认为,与其比较每种数据类型的功能,不如说最实用的答案是:“差别对于您须要完成的工做可能并不那么重要,尤为是由于它们都实现了IEnumerable
,所以请遵循流行的约定并使用一个List
直到您有理由不这样作为止,这时您可能有理由在List
使用数组。”
在大多数状况下,在托管代码中,您会倾向于尽量使集合易于使用,而没必要担忧微优化。
实际上,不多要使用数组。 每次要添加/删除数据时,请绝对使用List<T>
,由于调整数组的大小很是昂贵。 若是您知道数据是固定长度的,而且出于某些很是特定的缘由(基准化以后)想要进行微优化,则数组可能会有用。
List<T>
提供了更多的功能比的阵列(尽管LINQ找齐它一点),而且几乎老是正确的选择。 固然,除了params
参数。 ;-p
做为计数器List<T>
是一维的; 位置-如您有int[,]
或string[,,]
类的矩形(etc)数组-可是在对象模型中还有其余建模此类数据(若是须要)的方法。
也能够看看:
也就是说,我在protobuf-net项目中大量使用了数组; 彻底出于性能考虑:
byte[]
对于编码很是重要; byte[]
缓冲区,该缓冲区在向下发送到基础流(和vv)以前填充; 比BufferedStream
等更快; Foo[]
而不是List<Foo>
),由于一旦创建, List<Foo>
是固定的,而且须要很是快。 但这绝对是一个例外。 对于通常的业务流程处理,每次List<T>
获胜。