簡體   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