int i = 2008;
object obj = i; // 裝箱
Console.WriteLine($"1、i={i}, obj={obj}"); // 2008, 2008
i = 927; // 修改原值類型
Console.WriteLine($"2、i={i}, obj={obj}"); // 927, 2008 ← obj 未變!
object obj = i; 觸發**裝箱**:在堆上分配新對象,將 i 的值(2008)**複製**進去。obj 指向這個新對象。i = 927; 修改棧上變量 i 的值,**與堆上對象無關**。obj 仍保持裝箱時的值 2008。執行 object obj = i; 後:
棧:i → 2008
堆:obj → [Object Header][2008] (獨立副本)
執行 i = 927; 後:
棧:i → 927
堆:obj → [Object Header][2008] (未變)
object obj1 = 100; // 裝箱
object obj2 = obj1; // 引用賦值,指向同一堆對象
obj2 = 200; // 再次裝箱!obj2 指向新對象[200],obj1 仍指向[100]
Console.WriteLine(obj1); // 100
obj2 = 200 不是修改原對象,而是觸發**新裝箱**,obj2 指向新對象。
=)會改變引用指向,不影響原對象。class 封裝字段,或使用 ref/out 傳遞值類型地址。常見問題:「裝箱後修改原值,裝箱對象變嗎?」→ **不變**。
「object a=1; object b=a; b=2; a 是多少?」→ **1**(b=2 觸發新裝箱)。