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

问题是在初始化 box 数组的第一个元素之后。boxList 也发生了变化。我认为问题在于盒子数组作为引用存储在列表中。有没有解决的办法?这样boxlist就不会通过改变box数组来改变

4

3 回答 3

7

问题是在初始化 box 数组的第一个元素之后。boxList 也发生了变化。

不,这不对。与之前的boxesList内容完全相同:对盒子数组的引用。这里只有一个数组。如果你改变它,无论是通过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 回答