[英]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.