"I i can traverse a list using indexing as i do in an array.Why can't i add an item in a list as i



为什么我需要使用Add()将元素添加到List。为什么我不能使用索引并进行索引。当我穿过List的元素时,我会在索引的帮助下进行。

int head = -1;
List<char> arr = new List<char>();
public void push(char s)
{
    ++head;
    arr[head] = s;//throws runtime error.
    arr.Add(s);
}

在编译时间内不会丢任何错误。但是在运行时丢下错误,说明IndexOutOfRangeException

++head; 
arr[head] = s;

此尝试将列表的元素1设置为 s,但是尚无元素1,因为您尚未添加任何内容,也没有设置列表的长度。

创建数组时,您将定义一个长度,因此每个项目都有一个可以分配给的内存地址。

列表在您不知道要拥有多少个项目或它们的索引时很有用。

数组是固定尺寸的。分配它们后,您将无法从中添加或删除"插槽"。因此,如果您需要更大,则需要:

  1. 检测您需要一个更大的数组。
  2. 分配一个新的,更大的数组
  3. 将所有现有值复制到新的,更大的数组
  4. 从现在开始使用较大的阵列

所有列表所做的就是自动化精确的过程。它将自动检测到它在添加((过程中需要增加,然后自动执行步骤2-4。它甚至负责选择最初的大小以及生长多少(避免经常成长。

从理论上讲,他们可以通过将大小增长到11000来对清单[11000]做出反应。但是机会很大,这个价值是一个巨大的错误。而且,防止进程者犯有巨大的错误是其中一半的课程和编译器规则(例如强派特征(。因此,他们强迫您使用add((,以免发生这样的错误。

实际调用 myArray[2] do 添加元素,而只是 nistions 对数组中指定索引的对象。如果阵列的大小较小,您将获得IndexOutOfBoundsException,如list<T>所示。因此,如果使用索引器数组,则假设您实际上具有许多元素

var array = new int[3];
array[5] = 4; // bang

这是因为阵列具有固定大小,您无法更改。如果您分配索引的对象更大的数组大小,您获得了与List<T>相同的异常,此处也没有区别。

唯一的 real 差异是,当使用new array[3]时,您的尺寸为3的数组,索引最多为2,可以调用array[2]。但是,这只会返回默认值 - 如果int,这是零。相比之下,当使用new List<int>(3)时,您实际上没有三个元素。实际上,该列表根本没有项目并调用list[2]会引发异常。列表的参数仅为 apcation ,这是用于指示何时应调整列表何时进行调整的运行时的参数 - 您的数组甚至没有能力。

列表是一个数组包装器,其中内部数组大小由其方法管理。采用容量的构造函数仅在内部创建一个大小的数组,但是计数属性(反映已添加的计数元素(将为零。因此,本质上,数组中的零插槽已分配为一个值。

阵列的大小由您管理的程序员管理。这就是为什么您必须调用诸如System.Array.Resize之类的静态方法(请注意,数组参数为ref(,如果您想自己更改数组。该方法为新大小分配了新的内存。

,总而言之,列表本质上为您管理一个数组,因此,权衡是您只能访问与添加的数组一样多的类似数组的插槽。

最新更新