当我们在C#中重新重新定位一个数组时,会破坏数组的值



我正在与C#的Visual Studio中的项目合作,但是我不知道的一件事是,当我们重新分配数组(无论是什么类型)时,阵列中存储的先前值被破坏了还是不是?例如:

int[] a=new int[2];
a[0]=200;
a[1]=400;

现在,我将数组" A"重新分配给4个元素:

a=new int[4];

现在,先前的值是否会在那里,或者它们更改为新值,我的意思是垃圾,零,还是它们会像以前一样?我也在Visual Studio中自己尝试过,并且价值没有改变,但是我想确定他们是否真的没有。

这样做:

a = new int[4];

您将a设置为指向另一个内存区域中的另一个数组。

如果没有其他对旧数组的引用,它将在存储器中,直到下一个垃圾收集清除。

当您对以前数组的任何其他引用时,它仍然留在内存中。

int[] a=new int[2];
a[0]=200;
a[1]=400;
int[] additionalReference = a; // The array stays in memory 
a = new int[4];

否则,垃圾收集器会处理阵列(请参阅垃圾收集的基本原理)。

检查Array.resize的文档:

此方法分配一个具有指定大小的新数组,从旧数组到新数组的副本元素,然后用新数组替换旧数组。array必须是一个一维数组。

编写此行

a=new int[4];

创建了一个新数组。a [0]将为0。如果要调整数组大小

Array.Resize(ref a,4);

这将保留原始值并调整数组大小。

为了了解发生了什么,您首先必须了解变量的真正是什么。变量是值的占位符。那是什么价值?对于价值类型,值是值类型本身的实例,对于参考类型,值只是内存地址,可以说,可以说,对其引用的对象。

所以,当您执行以下操作时:

int[] a = new int[2];

由于数组是参考类型,因此存储在a中的值是新创建的数组的地址。

然后当您这样做时:

a = new int[4];

您唯一要做的就是覆盖a中存储的 value ,我们已经说过这只是其引用的对象的地址。

原始数组会发生什么?绝对没有,它生活在幸福的幸福之上,不知道您只是重新分配了一个指向它的参考。如果没有其他实时参考存在于原始数组,则GC 可以,如果是这样决定的,请收集它,但是当发生这种情况时,完全取决于GC(甚至可能根本不会发生您的应用程序的寿命)。

最新更新