首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# 引用類型賦值:player = players[n] 同指向一對象,修改屬性影響原數組

     編輯:程式設計疑難解答

現象


Player[] players = new Player[10];
Player player = players[n]; // 引用賦值
player.Name = "New";        // 修改屬性
// 發現 players[n].Name 也變為 "New"

原因

`Player` 為 **類(引用類型)**。
`player = players[n]` **複製的是引用(地址)**,兩個變量指向**同一個堆上對象**。
修改 `player.Name` 實際修改該對象的字段,`players[n]` 觀察到同一變化。

圖解


players[n] ──────┐
                 ▼
           +-------------+
           | Player Obj  |  Name="New"
           +-------------+
                 ▲
player ────────┘

對比:值類型


struct Point { public int X, Y; }
Point[] arr = new Point[10];
Point p = arr[0]; // 複製值
p.X = 99;         // 僅影響 p,arr[0].X 仍為 0

若需獨立副本

  1. 手動克隆:`Player player = players[n].Clone();`(實現 `ICloneable`/`Copy Constructor`)。
  2. 序列化反序列化:`JsonConvert.DeserializeObject(JsonConvert.SerializeObject(players[n]));`
  3. 構造函數複製:`Player player = new Player(players[n]);`

核心原則

  • **引用類型賦值 = 複製引用**,共享對象。
  • **值類型賦值 = 複製數據**,互不影響。
  • 方法參數傳遞同理:`void Foo(Player p)` 傳引用,`void Foo(Point p)` 傳值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved