0

好的,

我有一个敌人矩阵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) 不会反映到存储在网格中的对象中。

4

1 回答 1

3

线

Enemy tmp = enemyGrid[a, b]

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

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

更新

在您的示例中,您设置

tmp.canShoot = true;

但是之后

tmpEnemy.canShoot = false;

两个不同的变量。

更新 2

@Amry 的评论也很准确……如果Enemystruct而不是class,您会看到这种行为。那是因为struct是一个值类型,这意味着赋值确实创建了一个副本而不是别名。

除了非常特殊的情况,您永远不应该使用可变结构(即,在最初创建后其值可以更改的结构)。

于 2012-07-29T03:05:47.720 回答