3

我目前正在编写俄罗斯方块应用程序。我为我的石头使用了一个多维整数数组,它表示它们在多维面板字段 (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 具有与 location 变量完全相同的值,之后会发生变化!为什么?提前致谢!

4

3 回答 3

4

数组是引用类型。

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

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

于 2013-04-23T11:42:36.660 回答
1

在第二个示例中分配引用,同时在第一个示例中分配值。

当你做last_location = location; 您将变量last_location分配给指向您的位置的指针,因此当您更改位置值时,因为 last_location 指向location,在您看来,这些值也发生了变化。单个内存分区的last_location和location点。

在第一种情况下last_location[i][0] = location[i][0]您在循环中分配值,而不是引用,因此您的last_locationlocation指向具有不同值的不同内存分区。

于 2013-04-23T11:42:43.410 回答
1

当您分配last_location给 引用的对象时location

last_location = location;

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


实现您想要的最快的方法是初始化到与使用last_location相同的尺寸,locationBuffer.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));
于 2013-04-23T11:44:33.330 回答