6

我正在阅读 c# 数组,所以我的问题最初是关于数组的。

声明一个数组实际上意味着什么?我知道你声明了一个数组类型的变量。当我有以下情况时,实际发生了什么?

int[] values;

它在声明时是否在内存中?如果不是,那么它在哪里?数组实际上是在这里创建的吗?

然后我去实例化一个数组并用一些值初始化它,比如:

int[] values = new int[] { 1, 2, 3 };

这真的会现在创建数组吗?我读过数组是在声明时创建的,其他人说数组是在实例化时创建的。我正在努力使我的术语正确。

整数变量也是如此。如果我有:

int value;

int value = 1;

int 是什么时候创建的?什么时候添加到内存中?

对不起愚蠢的问题。我理解这个概念,但想知道数组背后的技术性。

4

4 回答 4

6

声明一个数组实际上意味着什么?

您实际上并没有声明一个数组,而是声明了一个数组引用。在 .NET 中很重要,引用类型和值类型之间的区别很重要。仅仅拥有数组引用变量是不够的,还需要一个额外的步骤来创建数组对象。这需要new关键字。它在存储引用类型对象的地方,即垃圾收集堆中为数组对象物理分配存储空间。

整数变量也是如此

不,差别很大。那是一种价值类型。如果它不是类的字段,从您的问题中不清楚,那么它是方法的局部变量。它在方法开始运行时创建,并在方法返回时消失。高度优化,值类型存在于 C# 中的核心原因。如果方法使用过多的局部变量,则物理存储位置通常是 cpu 寄存器或堆栈帧上的插槽。

如果它实际上是一个类的成员,那么它会在创建类对象时创建。就像一个数组,在 GC 堆上使用new关键字。

于 2013-07-11T14:09:19.710 回答
1
int[] values;

意味着您声明了一个 int[] 类型的变量。还没有占用内存,只创建了一个引用。上面的代码被初始化为一个空引用。

int[] values = new int[] { 1, 2, 3 };

这段代码声明了一个 int[] 类型的变量,并立即创建了一个数组。该变量引用新创建的数组。

整数的工作方式略有不同,因为它们是值类型。值类型被初始化为其默认值,如果是整数,则值为 0。

如果将声明和初始化分开,会发生以下情况。

// This declares a variable
int[] values;
// This creates the array, and initializes the variable with the newly created array.
values = new int[] { 1, 2, 3 };
于 2013-07-11T11:44:09.517 回答
1

当您声明一个数组时,在内部创建的只是一个类型为 的空指针int[]。当您new在示例中使用关键字或使用new int[6]时,系统会为数组的大小分配内存。

声明 anint实际上会为默认值为 0 的整数创建内存。

于 2013-07-11T11:45:49.583 回答
1

当你像这样声明它时:

int[] values;

您没有指定大小,因此无法知道实例化需要多少内存。此信息仅在以下行中给出:

values = new int[] { 1, 2, 3 };

内存需求是从实例化值的数量推导出来的(int当然,还有 type 的内存需求)。

当您声明这样的 int 时:

int value;

内存要求是已知的并且不能更改(因为int是值类型)。该变量可以(并且将)立即创建。如果您不指定初始值,它将具有默认值,int即为 is 0

于 2013-07-11T11:53:17.750 回答