繁体   English   中英

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

[英]Confused about object references in C#

好,

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

线

Enemy tmp = enemyGrid[a, b]

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

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

更新

在您的示例中,您设置了

tmp.canShoot = true;

但是之后

tmpEnemy.canShoot = false;

两个不同的变量。

更新2

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM