我正在阅读c#数组,所以我的问题最初是在数组上。
声明数组实际意味着什么?我知道你声明了一个类型为array的变量。当我有以下内容时,实际发生了什么?
int[] values;
它在声明时是否在内存中?如果不是那么它在哪里?阵列实际上是在这里创建的吗?
然后我去实例化一个数组并用一些值初始化它,如:
int[] values = new int[] { 1, 2, 3 };
这实际上是否会立即创建阵列?我已经读过,数组是在声明时创建的,有些人说数组是在实例化时创建的。我正在努力使我的术语正确。
整数变量也是如此。如果我有:
int value;
和
int value = 1;
何时创建int?什么时候被添加到内存中?
抱歉愚蠢的问题。我理解这个概念,但想知道数组背后的技术性。
答案 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
是值类型)。可以(并且将)立即创建此变量。如果您没有指定初始值,它将具有默认值,int
为0
。