1
List<Box[]> boxesList = new List<Box[]>(); // create a new list that contains boxes
Box[] boxes = new Box[9];                  // create an array of boxes
boxesList.Add(boxes);                      // add the boxes to the list
boxesList[0][0] = new Box(2, new Point(0, 0)); // change the content of the list
boxes[0] = new Box(1,new Point(0,0));      //  change content of the boxarray

問題は、boxes配列の最初の要素を初期化した後です。boxListも変更されます。問題は、ボックス配列が参照としてリストに格納されていることだと思います。これを回避する方法はありますか?ボックス配列を変更してもボックスリストが変更されないようにする

4

3 に答える 3

7

問題は、ボックス配列の最初の要素を初期化した後です。boxList も変更されます。

いいえ、ちがいます。の内容boxesListは以前とまったく同じで、ボックスの配列への参照です。ここには1 つの配列しかありません。それを変更すると、それが経由であろうとなかろうとboxesList[0]boxes同じ配列を変更しています。

配列のコピーを取得する場合は、明示的に行う必要があります。配列のコピーを作成してそのコピーへの参照をリストに入れるか、後で配列をコピーするかはあなた次第です。

詳細については、参照型と値型に関する私の記事を参照してください。すべての配列型は参照型であることを思い出してください。

于 2012-10-24T12:45:38.103 に答える
3

配列は参照です。配列をリストに入れると、参照をコピーするだけです。(同じ実際のオブジェクトの)新しいの配列が必要な場合は、配列をコピーする必要があります。

boxedList.Add((Box[])boxes.Clone());

これは浅いコピーにすぎないことに注意してください。この線:

boxes[0].SomeProp = newValue;

両方の場所に引き続き表示されます。それがうまくいかない場合は、ディープコピーが役立つかもしれませんが、率直に言って、Box不変にする方が簡単だと思います。

于 2012-10-24T12:45:55.263 に答える
0

リストの最初の要素のインデックスを上書きしています。両方のボックスがリストに表示されるように、コードを次のように変更します。

        List<Box[]> boxesList = new List<Box[]>(); // create a new list that contains boxes
        Box[] boxes = new Box[9];                  // create an array of boxes
        boxesList.Add(new Box[] { new Box(2, new Point(0, 0))}); // change the content of the list
        boxes[0] = new Box(1, new Point(0, 0)); 
        boxesList.Add(boxes);                      // add the boxes to the list
于 2012-10-24T12:54:53.473 に答える