设置两个多维数组相等时的行为

时间:2013-04-23 11:38:37

标签: c# arrays

我正在编写一个俄罗斯方块应用程序。我正在为我的石头使用多维整数数组,它表示它们在多维Panel字段上的位置(int [row] [colum])。

我现在正处于这样的位置,当石头向下移动时,我想要更新我的田地颜色。我想要更新当前的石头,而不是循环所有的字段和所有的俄罗斯方块石头,所以我为最后一个位置添加了一个变量。 但是我在设置这个变量时遇到了一些问题!

我现在的问题是,为什么这样做:

public void moveDown()
{
    for (int i = 0; i < location.Length; i++)
    {
        last_location[i][0] = location[i][0];
        last_location[i][1] = location[i][1];
        location[i][0] += 1;
    }
}

但这不是:

public void moveDown()
{
    last_location = location;
    for (int i = 0; i < location.Length; i++)
    {
        location[i][0] += 1;
    }
    //last_location got also updated??
}

这里的问题是,在循环之后,last_location具有与位置变量完全相同的值,后来改变 ! 为什么? 提前谢谢!

3 个答案:

答案 0 :(得分:4)

Array是引用类型。

因此,当您编写last_location = location;时,您不会创建数组的副本last_location使用与location相同的数组实例。

因此,当您修改两个变量中的一个时,在内存中修改了相同的唯一实例。

答案 1 :(得分:1)

在第二个示例中,您可以指定参考,同时在第一个示例中指定值。

当您执行 last_location = location; 时,您将变量 last_location 指定给您的位置,因此当您更改位置值时,因为位置上的last_location指向,在你看来,这些价值观也在发生变化。 last_location 位置都指向单内存分区

在第一种情况下 last_location [i] [0] = location [i] [0] 你在循环中分配值,而不是引用,所以 last_location 和< strong>位置指向具有不同值的不同内存分区

答案 2 :(得分:1)

last_location分配给location引用的对象时,

last_location = location;

然后你有两个对同一个对象的引用。 last_location引用的对象不再被引用,并将在适当的时候进行垃圾回收。


实现目标的最快捷方式是将last_location初始化为与location相同的维度并使用Buffer.BlockCopy

例如,

var location = new []
    {
        new int[10],
        new int[10]
    };

var last_location = new []
    {
        new int[10],
        new int[10]
    };

Buffer.BlockCopy(location, 0, last_location, 0, location.Length * sizeof(int));