Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在阵列内移动对象_C#_Arrays_Memory_Object_Xna - Fatal编程技术网

C# 在阵列内移动对象

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; 起初我认为这是个好主意,但现在当我一直在思考时,我不太确定。它是如何和内存等

我正在尝试用XNA制作一个类似俄罗斯方块的游戏,目前我正在考虑最好的处理方法

这就是我到目前为止所做的: 我有一个叫做Block的类,它有纹理和色彩

然后我打算把所有东西都放在一个双数组中,比如:

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的公平游戏