首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 語法學習:裝箱與拆箱詳細解析

     編輯:關於C#

概念定義

  • 裝箱:實值型別轉換為參考型別(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 壓力並降低效能。

常見無意裝箱情境

1. 非泛型集合

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(拆箱取得複本,非原結構體)

2. 字串格式化

int val = 10;
string s = "Value: " + val; // val 裝箱為 object 傳給 String.Concat
// 改用
string s2 = "Value: " + val.ToString(); // 避免裝箱
// 或
string s3 = string.Format("Value: {0}", val); // 內部仍會裝箱,但可讀性較好

3. 介面呼叫

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 傳遞結構體避免複製與裝箱。

圖解記憶體模型

堆疊與堆積 裝箱示意 拆箱示意 記憶體配置 效能比較
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved