对C#中的对象引用感到困惑

时间:2012-07-29 03:03:03

标签: c# oop

确定,

我有一个敌人矩阵Enemy enemyGrid[x, y]

然后,在我的代码中,我通过调用Enemy tmp = enemyGrid[a, b]

获得了一个敌人的实例

但是如果我在tmp中更改了一个属性,那么下次我将对象从矩阵加载到同一个对象tmp时就不会反映出来。

每次我完成tmp时,我都需要让= null将更改反映到网格中的对象中?

为什么?我认为tmp只会保存对象的引用,并且会直接在主对象中进行更改。

感谢。

代码更新:

填充网格:

Enemy [,] spriteGrid = new Enemy[countCols, countRows];
spriteGrid[x, y] = new Enemy();

访问对象并更改属性:

Enemy tmp = spriteGrid[i, j];

tmp.canShoot = true;
tmp.Update(gameTime, game.Window.ClientBounds);
tmp.canShoot = false;

最后一行(canShoot = false)不会反映到网格中存储的对象中。

1 个答案:

答案 0 :(得分:3)

该行

Enemy tmp = enemyGrid[a, b]

在矩阵中创建对象的副本。它为同一个对象实例创建别名。对 tmp 的更改会影响它们别名的网格中的实例。

请发布一个简短的完整代码段,演示您遇到的问题。

<强>更新

在您的示例中,您设置了

tmp.canShoot = true;

但是

tmpEnemy.canShoot = false;

两个不同的变量。

更新2

@ Amry的评论也是准确的......如果 Enemy struct 而不是,你会看到这种行为。这是因为 struct 值类型,这意味着赋值确实创建了副本而不是别名。

非常特殊的情况外,你应该永远使用一个可变的结构(即一个结构,它的值在最初创建后可以改变)。 / p>