【问题标题】:Changing all elements of list by accident意外更改列表的所有元素
【发布时间】:2021-10-12 08:30:46
【问题描述】:

我是 C# 编程新手,第一次遇到无法解决的意外代码行为。

List<int[]> snakeCoords = new List<int[]>();
snakeCoords.Add(new int[2] { 25, 10 });
int direction = 0;
while (true)
{
    Move(direction);
}
void Move(int direction)
{
    int[] headCoords = new int[2];
    headCoords = snakeCoords.Last();

    switch (direction)
    {
        case 0:
            headCoords[1]--;
            snakeCoords.Add(headCoords);
            break;

    }

这段代码是我提取到Main{}中的,所以没有受到其他任何影响,仍然不起作用。结果是snakeCoords.Count = 迭代次数,其中列表的每个元素都是{25,(10 - 迭代次数)}。我期望和想要的结果是 {25,10}、{25,9}、{25,8} 等元素的列表。 我可以想到一些解决方法,但我真的很想了解这段代码的作用。

【问题讨论】:

    标签: c# arraylist


    【解决方案1】:

    您丢弃分配给headCoordsnew int[2] 并用列表中已有的数组覆盖它。换句话说,最终列表中有 10 个 same 数组条目,因此每次修改都会反映在所有条目中,因为您每次修改的都是同一个数组。

    确保您复制克隆数组,或将数组中的值复制到新数组,而不是一次又一次地重复使用同一个数组。

    修复将被替换

    int[] headCoords = new int[2];
    headCoords = snakeCoords.Last();
    

    int[] headCoords = (int[]) snakeCoords.Last().Clone();
    

    【讨论】:

    • 谢谢。我忘记了 Array 是引用数据类型,所以我必须使用正确的方法来处理值。我曾经考虑过我通过参考,但我没有通过代码来思考它。经验教训:不要想,检查文档。也感谢您编辑我的帖子,所以下次我可以以正确的方式制作它。我希望我的下一个问题不会那么愚蠢。