加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么“索引超出范围”异常列表但不是数组?

发布时间:2020-12-15 06:44:51 所属栏目:百科 来源:网络整理
导读:当我初始化一个数组并使用索引器访问元素时,工作正常: object[] temp = new object[5];temp[0] = "bar"; 现在我期望同样的工作可以使用List T,因为您可以通过将容量传递给构造函数来初始化它: Listobject temp = new Listobject(5);temp[0] = "bar"; 然而,
当我初始化一个数组并使用索引器访问元素时,工作正常:
object[] temp = new object[5];
temp[0] = "bar";

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

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

然而,最后一行会抛出以下异常:

Index was out of range. Must be non-negative and less than the size of the collection

为什么这会发生在列表< T>类型,但不是数组?由于数组只是针对CLR的集合的较低级别抽象,那么为什么会发生此异常?

原来question by Awais Mahmood.

解决方法

简短的答案:因为5有很大的不同.

长答案:

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

object[] temp = new object[5];

意味着您创建一个包含5个元素的新数组.因此,您可以在创建数组后立即访问这些元素.

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

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

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

这意味着,您创建的列表具有零个元素(因此是异常),但内部数组初始化为5的大小,因此您可以添加5个元素,而不需要更换内部数组.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读