我编写了这个填充数组的代码,第二个数组复制了第一个数组。我更改了第二个数组中的一些数字,但是当我输出两个数组时,第一个数组也发生了变化。 这是我的代码:
int[] array1 = new int[5];
int[] array2 = new int[5];
int temp;
for (int i = 0; i < array1.Length; i++)
{
array1[i] = i;
}
array2 = array1;
temp = array2[2];
array2[2] = array2[4];
array2[4] = temp;
for (int i = 0; i < array1.Length; i++)
{
richTextBox1.Text += array1[i].ToString() + " ";
}
for (int i = 0; i < array2.Length; i++)
{
richTextBox1.Text += array2[i].ToString() + " ";
}
有人可以向我解释为什么输出为0 1 4 3 2 0 1 4 3 2而不是0 1 2 3 4 0 1 4 3 2?
答案 0 :(得分:4)
由于数组是引用类型,因此分配array2 = array1
会导致array2
变量引用与array1
相同的数组。
分配前:
array1 ---> [0, 1, 2, 3, 4]
array2 ---> [0, 0, 0, 0, 0]
分配后:
array1 ---> [0, 1, 2, 3, 4]
/
array2 - [0, 0, 0, 0, 0] <-- no longer reachable and will be garbage collected
要实际创建数组的副本,请调用Clone
。
array2 = (int[])array1.Clone();
与克隆分配后:
array1 ---> [0, 1, 2, 3, 4]
array2 - [0, 0, 0, 0, 0] <-- no longer reachable and will be garbage collected
\
-> [0, 1, 2, 3, 4]
请注意,[0, 0, 0, 0, 0]
数组从未实际使用过,因此您甚至不需要分配它。
//int[] array2 = new int[5]; <-- delete this line
int[] array2 = (int[])array1.Clone();
答案 1 :(得分:3)
array2 = array1;
您现在有两个引用相同数组的变量。
答案 2 :(得分:3)
array2 = array1;
您没有复制数组 - Array
是一种引用类型,您指定另一个变量指向相同的数组 - 只有一个数组实例,所以如果您更改它的内容通过一个变量,这些变化通过另一个变化。
答案 3 :(得分:2)
array2 = array1; // here you are losing reference to array2
答案 4 :(得分:2)
因为Arrays是其他人所说的引用类型。
您可以改用:
Array.Copy(array1, array2, array2.Length);