C# 为什么数组需要在定义时设置维度?

C# 为什么数组需要在定义时设置维度?,c#,arrays,C#,Arrays,我只是想知道,为什么我们不能这样定义: int[] arr = new int[]; arr[0] = 1; 像列表一样,自动调整大小。 我想知道的是为什么这是不可能的,我们需要按以下方式设置每次的大小: int[] arr = new int[1]; arr[0] = 1; 这是因为数组分配内存,而框架需要知道分配了多少内存 如果需要动态调整“数组”大小,请使用List 列表实际上包装了一个数组。当在当前数组中添加更多项目时,将创建一个新数组(通常大小为两倍),旧项目将移动到新数组中。删除

我只是想知道,为什么我们不能这样定义:

int[] arr = new int[];
arr[0] = 1;
像列表一样,自动调整大小。 我想知道的是为什么这是不可能的,我们需要按以下方式设置每次的大小:

int[] arr = new int[1];
arr[0] = 1;

这是因为数组分配内存,而框架需要知道分配了多少内存

如果需要动态调整“数组”大小,请使用
List


列表实际上包装了一个数组。当在当前数组中添加更多项目时,将创建一个新数组(通常大小为两倍),旧项目将移动到新数组中。删除则相反。

我的猜测是“因为它是以这种方式指定的”-这种情况会给阵列带来非常理想的特定性能特征和优化功能。虽然这些优点已经被设计者注意到,并且在影响语言的同时也使用类似的构造(C,C++,java脚注1),他们可以诚实地定义它来做任何事情。
List
例如,必须调整内部数组的大小,通常分配的内存比需要的要多(除非您恰好使用的内存与分配的内存一样多),还必须创建垃圾

:

数组是包含多个变量的数据结构,这些变量 通过计算索引访问。表中包含的变量 数组,也称为数组的元素,都是相同的 类型,此类型称为数组的元素类型

数组类型是引用类型,是数组变量的声明 只需为数组实例的引用留出空间。实际的 阵列实例在运行时使用新的 接线员新操作指定新数组的长度 实例,然后在实例的生存期内对其进行修复。 数组元素的索引范围从0到长度-1。这个 new运算符自动将数组的元素初始化为 它们的默认值,例如,所有数字类型的默认值都为零 对于所有引用类型,为空

此外,其他人未提及的数组边界检查被视为“软件工程原理”——如在以下章节中描述其设计目标时所述:

该语言及其实现应支持 软件工程原理,如强类型检查,数组 边界检查,检测使用未初始化变量的尝试, 和自动垃圾收集。软件健壮性、耐用性和可靠性 程序员的生产力很重要

:

C#(发音为“See Sharp”)是一种简单、现代、面向对象且 类型安全编程语言。C#起源于 语言和<>强>将立即熟悉C、C++和java 程序员。


因为数组的大小在定义上是静态的,而不是动态的

如果您想要一个动态大小的集合,那么还可以使用其他集合,如您提到的列表

不过,您可以延迟声明数组的大小:

int[] numbers;
numbers = new int[10];  
numbers = new int[20];  
列表的大小调整基于在需要时在幕后创建一个新数组

考虑一下这里的底层实现是什么样子的。当您分配一个数组时,它会保留一块内存,而引用实际上直接指向该内存。如果您需要存储比保留的值更多的值,则需要在其他地方分配更多内存。。。但是您不能更改引用以引用新内存,因为这些引用分布在所有地方。(数组不知道引用它的是什么。)

解决这个问题的一个明显的方法是有一个间接级别,这样初始引用是指向一个跟踪真实数据存储位置的对象,这样它就可以在需要时重新分配。这正是
List
所做的。。。但这确实意味着有额外的间接性。这在效率上是有代价的,部分原因是您很可能将实际数据从
列表
对象本身长时间地存储在内存中,这不利于缓存。。。简单地通过一个额外的间接层次本身就有成本

基本上,如果您想要一个动态大小的集合,请使用
List
——这就是它的用途。如果您从一开始就知道最终大小,并且希望从阵列的“更接近金属”方面获益,请改用它们


数组是一个相对低级的概念-如果您想要一个高级抽象,请使用一个…

因为数组在内存中是连续的,所以在创建数组时必须为其内容分配足够的内存

假设您有一个包含100项的数组。现在再添加1个,您必须在第100项之后声明内存地址。如果那个地址已经被使用了怎么办


这就是为什么不能动态调整数组的大小。

因为数组就是这样工作的。它们被语言定义为固定大小的容器。@mehow我觉得这是一个非常有趣的问题。答案“因为C#/CLR规范是这么说的”并不像你自己所说的那样公正。这样做的尝试,特别是在与C++的数组和向量进行比较时,给了我新的见解。@PeterSchneider我部分同意这个问题本身的概念很有趣,但所写的问题很糟糕,没有给我们提供关于操作技能的线索。在我看来,这太宽泛了,无法回答。我们不知道OP的技能水平,所以很难解释为什么它是从零开始的。一个正确的答案可能和一本短小的书一样长,因此我认为这个问题在目前的形式下是不可回答的。像“因为规格说明如此”这样的回答表明我正在与@Peter Schneider打交道,我同意。这是一个许多人都不知道答案的“愚蠢问题”,因此无论是有意还是无意,这都是一个聪明的问题。即使是我的思考也会让我感到困惑