object 或介面),在堆疊配置記憶體並複製值。object 取回實值型別,需顯式轉型,驗證型別後複製值回堆疊。int i = 123; // 1. 裝箱:i → object o
object o = i;
i = 456;
Console.WriteLine(i + ", " + (int)o); // 2. 裝箱 i、3. 拆箱 o、4. 裝箱拆箱結果
// 總計:3 次裝箱、1 次拆箱
MSDN 指出:裝箱耗時約為單純指派的 20 倍,拆箱約 4 倍。頻繁裝箱/拆箱會增加 GC 壓力並降低效能。
ArrayList list = new ArrayList();
struct Point { public int X, Y; }
Point p = new Point { X = 1, Y = 2 };
list.Add(p); // 裝箱
p.X = 3;
Console.WriteLine(((Point)list[0]).X); // 輸出 1(拆箱取得複本,非原結構體)
int val = 10;
string s = "Value: " + val; // val 裝箱為 object 傳給 String.Concat
// 改用
string s2 = "Value: " + val.ToString(); // 避免裝箱
// 或
string s3 = string.Format("Value: {0}", val); // 內部仍會裝箱,但可讀性較好
struct MyStruct : IComparable { public int CompareTo(object obj) => 0; }
MyStruct ms = new MyStruct();
IComparable cmp = ms; // 裝箱至介面
cmp.CompareTo(null); // 透過介面呼叫
List<T>、Dictionary<TKey,TValue>)。IEquatable<T>)。ToString() 或 StringBuilder。ref、out、in 傳遞結構體避免複製與裝箱。