我正在与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
(甚至可能根本不会发生您的应用程序的寿命)。