C#列表:用大小初始化,为什么可以';在.Add()之后才能使用[]访问?

C#列表:用大小初始化,为什么可以';在.Add()之后才能使用[]访问?,c#,arrays,list,C#,Arrays,List,这适用于阵列: int[] a = new int[10]; for (int i = 0; i < 10; i++) { a[i] = i; } int[]a=新的int[10]; 对于(int i=0;i

这适用于阵列:

int[] a = new int[10];
for (int i = 0; i < 10; i++)
{
    a[i] = i;
}
int[]a=新的int[10];
对于(int i=0;i<10;i++)
{
a[i]=i;
}
但这会抛出一个ArgumentOutOfRangeException和一个列表:

List<int> a = new List<int>(10);
for (int i = 0; i < 10; i++)
{
    a[i] = i;
}
List a=新列表(10);
对于(int i=0;i<10;i++)
{
a[i]=i;
}

为什么呢?我认为这会列出内部使用的阵列。

您正在初始化容量,而不是大小。计数仍然是零。初始化容量允许在创建列表时知道最大大小时优化内部数据结构(数组)的大小。这将使内部数组保持已知大小,并防止在添加已知数量的元素时重新调整内部数组的大小。

新建列表(10)
创建初始容量为10个项目的新列表。列表仍然是空的


您需要先向集合中添加项目,然后才能通过索引访问它们。

如果您不指定容量,则即使集合增加到100个元素,也会多次重新分配集合。这使得填充列表的速度增加了一倍

参考这个