0

配列を埋めるこのコードを書き、2 番目の配列が最初の配列をコピーします。2 番目の配列のいくつかの数値を変更しましたが、両方の配列を出力すると、最初の配列も変更されています。これは私のコードです:

        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 2 3 4 0 1 4 3 2ではなく0 1 4 3 2 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;

これで、同じ配列を参照する 2 つの変数ができました。

于 2012-06-03T14:46:34.203 に答える
3
array2 = array1;

配列をコピーしていません-参照型であり、同じ配列Arrayを指す別の変数を割り当てています-配列インスタンスは1つしかないため、1つの変数を介してその内容を変更すると、これらの変更は他の変数を介して認識されます。

于 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 に答える