实际上,您很少想要使用数组.绝对可以List
随时使用添加/删除数据,因为调整数组大小非常昂贵.如果您知道数据是固定长度的,并且您希望根据某些非常具体的原因进行微优化(在基准测试之后),那么数组可能会很有用.
List
提供了很多更多的功能不是一个数组(虽然LINQ找齐它一点),而且几乎总是正确的选择.params
当然,除了争论.;-p
作为反击 - List
是一维的; 在哪里 - 因为你有矩形(等)数组,int[,]
或者string[,,]
- 但是在对象模型中还有其他方法可以建模这些数据(如果需要).
也可以看看:
如何/何时放弃在c#.net中使用数组?
数组,有什么意义?
也就是说,我在protobuf-net项目中大量使用了数组; 完全是为了表现:
它会进行大量的位移,所以a byte[]
对编码非常重要;
我使用一个本地滚动byte[]
缓冲区,在发送到底层流(和vv)之前我填充; 比BufferedStream
等更快;
它在内部使用基于数组的对象模型(Foo[]
而不是List
),因为大小一旦构建就固定,并且需要非常快.
但这绝对是个例外; 对于一般的业务线处理,List
每次都获胜.
实际上,您很少想要使用数组.绝对可以List
随时使用添加/删除数据,因为调整数组大小非常昂贵.如果您知道数据是固定长度的,并且您希望根据某些非常具体的原因进行微优化(在基准测试之后),那么数组可能会很有用.
List
提供了很多更多的功能不是一个数组(虽然LINQ找齐它一点),而且几乎总是正确的选择.params
当然,除了争论.;-p
作为反击 - List
是一维的; 在哪里 - 因为你有矩形(等)数组,int[,]
或者string[,,]
- 但是在对象模型中还有其他方法可以建模这些数据(如果需要).
也可以看看:
如何/何时放弃在c#.net中使用数组?
数组,有什么意义?
也就是说,我在protobuf-net项目中大量使用了数组; 完全是为了表现:
它会进行大量的位移,所以a byte[]
对编码非常重要;
我使用一个本地滚动byte[]
缓冲区,在发送到底层流(和vv)之前我填充; 比BufferedStream
等更快;
它在内部使用基于数组的对象模型(Foo[]
而不是List
),因为大小一旦构建就固定,并且需要非常快.
但这绝对是个例外; 对于一般的业务线处理,List
每次都获胜.
真的只是回答添加一个我很惊讶的链接尚未被提及:Eric的Lippert的博客文章"Arrays被认为有些危害".
您可以从标题中判断它建议在任何实际情况下使用集合 - 但正如Marc正确指出的那样,有很多地方阵列确实是唯一实用的解决方案.
尽管推荐了其他答案List
,但您还是希望在处理时使用数组:
图像位图数据
其他低级数据结构(即网络协议)
除非你真的关心性能,我的意思是"你为什么使用.Net而不是C++?" 你应该坚持使用List <>.它更容易维护,并为您在幕后调整阵列大小的所有脏工作.(如果需要,List <>非常聪明地选择数组大小,因此通常不需要.)
当集合本身的不变性是客户端和提供者代码之间的契约的一部分(不一定是集合中项目的不变性)和IEnumerable不适合时,应该优先使用数组.
例如,
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 ListstrChars.Insert(0, 'X');
在这种情况下,单独的代码片段不清楚插入方法是否会改变原始的"str"对象.它需要String的实现级知识才能做出决定,从而打破了"按合同设计"的方法.在String的情况下,它并不是什么大问题,但在几乎所有其他情况下它都是一个大问题.将List设置为只读确实有帮助,但会导致运行时错误,而不是编译时.