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

深入理解 C#「值類型」:不只是數值類型,而是繼承 System.ValueType 的結構體

     編輯:關於C#

常見誤區

許多開發者認為「值類型」等同於 int、bool 等數值類型。實則不然——值類型的本質是「繼承自 System.ValueType 的類型」。

C# 類型系統鐵律:一切皆物件

  • 所有類型(含值類型)最終繼承自 System.Object。
  • System.ValueType 繼承 System.Object,並覆寫 Equals()、GetHashCode() 等方法提供值語意。
  • 所有 struct(結構體)隱性繼承 System.ValueType,不可再繼承其他類別(但可實作介面)。
  • int、double、bool 等關鍵字,分別是 System.Int32、System.Double、System.Boolean 等結構體的別名。

IL 層面驗證:struct 編譯後繼承 ValueType

public struct CustomerStruct {
    public string Name { get; set; }
}

編譯後 IL 顯示:

.class public sequential ansi sealed beforefieldinit CustomerStruct
       extends [mscorlib]System.ValueType
IL 反編譯截圖:struct 繼承 ValueType

CLR 對值類型的特殊處理

操作值類型參考類型
記憶體配置堆疊(或內嵌於物件內部)受控堆積
變數賦值複製實例資料(副本)複製參考(指標)
傳遞給方法預設傳值(可用 ref/out 改傳址)傳參考
裝箱堆疊→堆積,建立物件包裝器無需裝箱
拆箱堆積→堆疊,提取資料副本不適用

裝箱範例

object o = new object();
int aaa = 100;
o = aaa; // 發生裝箱:CLR 在堆積配置新物件,複製 aaa 的值 100 進去

CLR 偵測到 aaa 為 ValueType 衍生類型,自動在堆積配置記憶體並複製數值——這一切對開發者透明,但會影響效能。

核心結論

  1. 代碼層面:C# 中所有類型皆為「類別型別」(繼承 Object)。
  2. 值類型 ≠ 數值類型:凡繼承 System.ValueType 者皆為值類型,包含所有 struct、enum、基本型別。
  3. 語言/執行層支援:CLR 提供值類型的記憶體配置、複製語意、裝箱拆箱機制,開發者無需手動管理。
理解值類型本質,有助於避免不必要的裝箱拆箱、正確選擇 struct vs class、優化高效能場景的記憶體佈局。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved