在数组内移动对象

时间:2009-02-02 18:59:53

标签: c# arrays memory object xna

我正在尝试在XNA中制作类似俄罗斯方块的游戏,目前我正在考虑以最佳方式处理它。

这是我到目前为止所做的: 我有一个名为Block的类,它具有例如纹理和颜色色调。

然后我计划将所有内容都放在双数组中,例如:

Block[,] blocks = new Block[10,20];

然后是完整的网格。

然后当积木向下移动时,我想这样做:

blocks[x,y+1] = blocks[x,y];

blocks[x,y] = null;

起初我认为这是一个好主意,但现在我一直在想我不太确定。它如何与内存一起工作?每次我这样做或者什么时候它会创建一个新对象吗?有人可以解释当我在一个数组中移动一个对象时它是如何工作的吗?

我并不是真的在寻找特定于俄罗斯方块的答案,我只是对它的实际效果感兴趣。

感谢。

3 个答案:

答案 0 :(得分:2)

不,你只是在移动指针。当你说:

blocks[x,y+1] = blocks[x,y];

你实际上在做的是交换指针。该对象将保持精确的位置,但现在而不是它在索引x,y它将在x,y + 1的索引处。当你说

blocks[x,y] = null;

你要删除对象x,y的引用,如果没有其他东西拿着引用,垃圾收集器会清理它。

答案 1 :(得分:1)

上面的第一个答案几乎是正确的,但是赋值不是交换指针,而是重复它。在第一行代码之后,有两个对最初在块[x,y]处引用的对象的引用。空赋值会删除原始引用,但您仍然可以在块[x,y + 1]处生成新引用。 Null一个和堆对象将是GC的公平游戏。

答案 2 :(得分:0)

如果在数组中存储值类型(例如int,string),那么每次复制值时确实会创建数据的副本,因为值类型在C#中是不可变的。由于您在数组中存储了一个类(它是一个引用类型),因此您的代码实际上只是复制指针而不是整个对象。