我正在编写一个俄罗斯方块应用程序。我正在为我的石头使用多维整数数组,它表示它们在多维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具有与位置变量完全相同的值,后来改变 ! 为什么? 提前谢谢!
答案 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));