C# 在阵列内移动对象
我正在尝试用XNA制作一个类似俄罗斯方块的游戏,目前我正在考虑最好的处理方法 这就是我到目前为止所做的: 我有一个叫做Block的类,它有纹理和色彩 然后我打算把所有东西都放在一个双数组中,比如:C# 在阵列内移动对象,c#,arrays,memory,object,xna,C#,Arrays,Memory,Object,Xna,我正在尝试用XNA制作一个类似俄罗斯方块的游戏,目前我正在考虑最好的处理方法 这就是我到目前为止所做的: 我有一个叫做Block的类,它有纹理和色彩 然后我打算把所有东西都放在一个双数组中,比如: Block[,] blocks = new Block[10,20]; 这将是完整的网格 当积木向下移动时,我想这样做: blocks[x,y+1] = blocks[x,y]; blocks[x,y] = null; 起初我认为这是个好主意,但现在当我一直在思考时,我不太确定。它是如何和内存等
Block[,] blocks = new Block[10,20];
这将是完整的网格
当积木向下移动时,我想这样做:
blocks[x,y+1] = blocks[x,y];
blocks[x,y] = null;
起初我认为这是个好主意,但现在当我一直在思考时,我不太确定。它是如何和内存等一起工作的?每次我这样做时它都会创建一个新对象吗?有人能解释一下当我在数组中移动一个对象时它是如何工作的吗
我不是真的在寻找俄罗斯方块特有的答案,我只是对它的实际运作方式感兴趣
谢谢。不,你只是在移动指针而已。当你说:
blocks[x,y+1] = blocks[x,y];
实际上,您所做的是交换指针。对象将精确地停留在它所在的位置,但是现在它不是在索引x,y,而是在索引x,y+1。当你说
blocks[x,y] = null;
在这里,您正在删除对对象x,y的引用,如果没有其他对象包含引用,垃圾收集器将清理它。不,您只是在四处移动指针。当你说:
blocks[x,y+1] = blocks[x,y];
实际上,您所做的是交换指针。对象将精确地停留在它所在的位置,但是现在它不是在索引x,y,而是在索引x,y+1。当你说
blocks[x,y] = null;
在这里,您正在删除对对象x,y的引用,如果没有其他对象保存引用,垃圾收集器将清理它。如果您在数组中存储值类型(如int,string),那么每次复制一个值时确实会创建一个数据副本,因为值类型在C#中是不可变的。由于在数组中存储类(引用类型),因此代码实际上只是复制指针,而不是整个对象。如果在数组中存储值类型(如int、string),则每次复制值时都会创建数据副本,因为值类型在C#中是不可变的。由于在数组中存储类(引用类型),因此代码实际上只是复制指针,而不是整个对象。上面的第一个答案几乎正确,但赋值不是交换指针,而是复制指针。在第一行代码之后,有两个对最初在块[x,y]处引用的对象的引用。null赋值将删除原始引用,但新引用仍位于块[x,y+1]处。Null表示一个和堆对象对GC来说是公平的游戏。上面的第一个答案几乎是正确的,但赋值不是交换指针,而是复制指针。在第一行代码之后,有两个对最初在块[x,y]处引用的对象的引用。null赋值将删除原始引用,但新引用仍位于块[x,y+1]处。Null表示一个和堆对象将是GC的公平游戏