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

C#核心機制揭秘:為什麼object引用賦值後修改原變量不影響副本?

     編輯:程式設計綜合問答

現象重現


object a = 1;  // 裝箱:堆上創建Integer對象(值1),a引用它
object b = a;  // 引用複製:b指向同一個堆對象
a = 2;         // 再次裝箱:堆上創建新Integer對象(值2),a指向新對象
Console.Write(b);  // 輸出1

記憶體圖解

步驟1: a = 1
堆: [Integer:1] ← a
      ↑
      b (尚未創建)

步驟2: b = a
堆: [Integer:1] ← a
                    ← b (同一地址)

步驟3: a = 2
堆: [Integer:1] ← b
      [Integer:2] ← a (新對象,新地址)

核心結論

  1. 引用類型傳遞的是「引用的副本」,而非對象本身
  2. 賦值操作(`=`)會切斷舊引用關係,指向新對象
  3. 不可變類型(String、包裝類)天然線程安全,任何「修改」實為新建

對比:可變引用類型行為


List list1 = new List {1};
List list2 = list1;  // 同一對象
list1.Add(2);             // 修改對象內部狀態
Console.Write(list2.Count);  // 輸出2,因指向同一對象

面試必考點總結

操作值類型引用類型(不可變)引用類型(可變)
賦值複製值複製引用複製引用
修改變量互不影響指向新對象,原對象不變可通過任意引用修改共享狀態
典型例子int, structstring, 包裝類class, List, Array

總結

`a = 2`不是修改原對象,而是讓`a`指向新對象。`b`依然忠實地指向舊對象。這正是引用語義的精髓:變量持有引用,賦值複製引用,操作作用於對象。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved