声明和实例化c#数组实际上意味着什么?

时间:2013-07-11 11:39:52

标签: c# .net reference-type indirection

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

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

int[] values;

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

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

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

这实际上是否会立即创建阵列?我已经读过,数组是在声明时创建的,有些人说数组是在实例化时创建的。我正在努力使我的术语正确。

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

int value;

int value = 1;

何时创建int?什么时候被添加到内存中?

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

4 个答案:

答案 0 :(得分:6)

  

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

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

  

整数变量

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

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

答案 1 :(得分: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 };

答案 2 :(得分:1)

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

声明int实际上会为整数创建内存,默认值为0.

答案 3 :(得分:1)

当你声明它时:

int[] values;

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

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

内存要求是从实例值的数量(以及类型int的内存要求)中推断出来的。

当您声明这样的int时:

int value;

内存要求已知且无法更改(因为int是值类型)。可以(并且将)立即创建此变量。如果您没有指定初始值,它将具有默认值,int0