繁体   English   中英

列表为什么“索引超出范围”例外 <T> 但不是阵列?

[英]Why “Index was out of range” exception for List<T> but not for arrays?

当我使用索引器初始化数组和访问元素时,它可以正常工作:

object[] temp = new object[5];
temp[0] = "bar";

现在我希望同样适用于List<T> ,因为您可以通过将容量传递给构造函数来初始化它:

List<object> temp = new List<object>(5);
temp[0] = "bar";

但是,最后一行会引发以下异常:

指数超出范围。 必须是非负数且小于集合的大小

为什么这会发生在List<T>类型中,而不是数组? 由于数组只是CLR集合的低级抽象,那么为什么会发生这种异常呢?


Awais Mahmood的原始问题

简短的回答:因为5做的事情非常不同。

答案很长:

初始化数组时,您可以设置其大小,并且该大小是固定的。 该阵列以后不能增长或缩小。 因此,

object[] temp = new object[5];

表示您创建一个包含5个元素的新数组。 因此,您可以在创建阵列后立即访问这些元素。

对于列表,大小是可变的。 List<T>类的实例在内部使用数组来存储它们的项目,当您在列表中添加或删除项目时,该数组将被更大或更小的数组替换。 在每种情况下,列表中保留的所有项目都会从上一个数组复制到新数组。 由于这是一项非常昂贵的操作,因此内部阵列有一些未使用的项目的开销。 只要将项添加到列表中并且不超过该内部数组的大小,就不需要替换该数组。

传递给列表构造函数的5是该内部数组的初始大小:

List<object> temp = new List<object>(5);

这意味着,您创建的列表具有零元素 (因此例外),但内部数组初始化为5,因此您可以添加5个元素,而无需替换内部数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM