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

C# 裝箱與拆箱:本質是型別別名對應

     編輯:關於C#

核心觀點

所謂「裝箱/拆箱」在 C# 中實際上是**值型別與其對應參考型別包裝類別之間的轉換**。C# 為了語法簡潔,提供了關鍵字作為**型別別名** (alias),編譯時會對應至 .NET 運行時的實際類別。

關鍵字與系統類別對應表

C# 關鍵字.NET 類別分類大小/範圍
boolSystem.Boolean值型別1 byte (true/false)
byteSystem.Byte值型別0~255
sbyteSystem.SByte值型別-128~127
charSystem.Char值型別UTF-16 字元
shortSystem.Int16值型別-32,768~32,767
ushortSystem.UInt16值型別0~65,535
intSystem.Int32值型別-2,147,483,648~2,147,483,647
uintSystem.UInt32值型別0~4,294,967,295
longSystem.Int64值型別±9.22×10¹⁸
ulongSystem.UInt64值型別0~1.84×10¹⁹
floatSystem.Single值型別7 位有效數字
doubleSystem.Double值型別15-16 位有效數字
decimalSystem.Decimal值型別28-29 位有效數字
objectSystem.Object參考型別所有型別基類
stringSystem.String參考型別不可變字串

驗證程式碼


private void ShowAliases()
{
    byte b = 1; char c = 'a'; short s = 1;
    int i = 2; long l = 3; uint u = 4; bool bl = true;

    var sb = new StringBuilder();
    sb.AppendLine($"byte  -> {b.GetType().FullName}");   // System.Byte
    sb.AppendLine($"char  -> {c.GetType().FullName}");   // System.Char
    sb.AppendLine($"short -> {s.GetType().FullName}");   // System.Int16
    sb.AppendLine($"int   -> {i.GetType().FullName}");   // System.Int32
    sb.AppendLine($"long  -> {l.GetType().FullName}");   // System.Int64
    sb.AppendLine($"uint  -> {u.GetType().FullName}");   // System.UInt32
    sb.AppendLine($"bool  -> {bl.GetType().FullName}");  // System.Boolean
    textBox.Text = sb.ToString();
}

裝箱/拆箱實際發生時機


int val = 123;
object obj = val;        // 裝箱:配置物件、複製值
int val2 = (int)obj;     // 拆箱:型別檢查、複製值

// 隱性裝箱常見場景
ArrayList list = new ArrayList();
list.Add(100);           // 裝箱
int x = (int)list[0];    // 拆箱

// 避免裝箱:使用泛型集合
List genericList = new List();
genericList.Add(100);    // 無裝箱
int y = genericList[0];  // 無拆箱

效能影響與最佳實踐

  • 裝箱:堆上配置記憶體、複製值、GC 壓力 → **避免在熱路徑**。
  • 拆箱:型別檢查、複製值 → **避免在熱路徑**。
  • 解決方案:全面使用**泛型** (List<T>, Dictionary<TKey,TValue>, Span<T>) 替代 ArrayList/Hashtable/object 參數。
  • 值型別介面呼叫:IEquatable<T>、IComparable<T> 避免介面呼叫裝箱。

結論

理解「關鍵字 = 別名 = 系統類別」,即可明白裝箱拆箱本質為**值型別與其包裝類別 (System.Int32 等) 與 object 之間的轉換**。現代 C# 開發**以泛型為主,極少直接面對裝箱拆箱**,但理解其機制有助於效能調優與舊代碼維護。

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