字符串数组和c#中的字符串列表有什么区别

42 c# arrays string

我在MSDN上听说阵列比集合更快.

你能告诉我那么string[]快吗?List<string>.

Jon*_*eet 50

数组是比列表等集合更低级的抽象.CLR直接了解数组,因此迭代,访问等涉及的工作量略少.

但是,这几乎应该决定你实际使用哪个.在大多数实际应用中,性能差异可以忽略不计.我很少发现使用数组而不是各种泛型集合类是合适的,事实上有些人认为数组有些有害.一个重要的缺点是没有不可变数组(除了空数组)之外......而您可以相对容易地通过API公开只读集合.

  • 鉴于MSDN声称"List <T>类是ArrayList类的通用等价物.它使用一个数组来实现IList <T>泛型接口,该数组的大小根据需要动态增加." 难道这并不意味着一旦编译,List <>和数组之间的主要区别在于List <>中的某些方法需要检查是否需要调整大小? (2认同)
  • @mcl:每个访问最终都会通过一个包装层,基本上 - 这与"原始"数组不会发生.这增加了一小部分性能. (2认同)

bni*_*dyc 9

这篇文章是从2004年开始的,这意味着它是关于.net 1.1而且没有泛型.数组与收集性能实际上是一个问题,因为集合类型导致了很多exta装箱拆箱操作.但自从引入泛型的.net 2.0以来,性能差异几乎消失了.


Jon*_*Jon 6

数组不可调整大小.这意味着在创建时会分配一个内存块,大小足以容纳您指定的多个元素.

List另一方面,A 是隐式可调整大小的.每次有Add一个项目时,框架可能需要分配更多内存来保存刚添加的项目.这是一个昂贵的操作,所以我们最终说"List比数组慢".

当然这是一个非常简化的解释,但希望足以描绘出来.

  • “每次添加项目时”都可能需要调整底层数组的大小,这并不完全正确;特别是在一行中从来没有很多这样的调整大小。List 类经过精心设计,因此您永远不会遇到多次连续添加导致多次连续调整大小的情况。调整大小的摊销次数应与达到的最大大小的对数成正比;复制的项目总数应与最大大小成正比。 (2认同)