0

我编写了填充数组的代码,第二个数组复制了第一个数组。我更改了第二个数组中的一些数字,但是当我输出两个数组时,第一个数组也发生了变化。这是我的代码:

        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?

4

5 回答 5

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();
于 2012-06-03T14:46:30.997 回答
3
array2 = array1;

您现在有两个变量引用同一个数组。

于 2012-06-03T14:46:34.203 回答
3
array2 = array1;

您没有复制数组 -Array是一种引用类型,并且您正在分配另一个变量以指向同一个数组- 只有一个数组实例,因此如果您通过一个变量更改其内容,这些更改将通过另一个变量感知。

于 2012-06-03T14:47:10.000 回答
2
array2 = array1;   // here you are losing reference to array2
于 2012-06-03T14:46:57.393 回答
2

因为数组是其他人所说的引用类型。

您可以改用它:

Array.Copy(array1, array2, array2.Length);
于 2012-06-03T15:02:34.460 回答