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

本文关键字:数组 实际上 意味着 什么 一个 实例化 声明 | 更新日期: 2023-09-27 18:22:01

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

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

int[] values;

当它被声明时,它在内存中吗?如果没有,它在哪里?数组真的是在这里创建的吗?

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

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

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

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

int value;

int value = 1;

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

抱歉问了这么多愚蠢的问题。我理解这个概念,但想知道阵列背后的技术性。

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

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

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

整数变量也是如此

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

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

当您这样声明它时:

int[] values;

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

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

内存需求是从初始化值的数量(当然还有int类型的内存需求)推导出来的。

当你像这样声明一个int时:

int value;

存储器需求是已知的并且不能改变(因为int是值类型)。此变量可以(也将)立即创建。如果不指定初始值,它将具有默认值,int0

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 };

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

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