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

C# 型別系統全景:值型別 vs 參考型別、簡單型別、結構、列舉、Tuple 與記憶體模型

     編輯:關於C語言

前言:資料型別是程式的骨架

每個變數宣告必須指定型別,編譯器才能配置正確記憶體。C# 型別系統分為兩大派系:

一、值型別 — 直接包含資料

儲存於 Stack(區域變數)或 Inline 於包含物件中。指派 = 複製實體。

1. 簡單型別 — 語言內建關鍵字對應 .NET 型別

關鍵字.NET 型別分類
sbyteSystem.SByte整數
byteSystem.Byte
shortSystem.Int16
ushortSystem.UInt16
intSystem.Int32
uintSystem.UInt32
longSystem.Int64
ulongSystem.UInt64
floatSystem.Single浮點
doubleSystem.Double
decimalSystem.Decimal十進位
boolSystem.Boolean布林
charSystem.Char字元

詳細內容請參閱各專題文章:整數、布林、浮點/Decimal、字元。

2. 結構型別 struct

  • 使用者定義的值型別
  • 封裝相關資料(如 Point、DateTime、Guid)
  • 不可繼承、不可為 null(除 Nullable<T>)
  • 詳見 結構型別專題

3. 列舉型別 enum

  • 具名常數集合,底層為整數型別
  • 提供型別安全與語意
  • 詳見 列舉型別專題

4. Tuple 型別 (C# 7.0+)

var point = (X: 10, Y: 20);  // ValueTuple<int, int> - 值型別
var (x, y) = point;          // 解構
Console.WriteLine($"{point.X}, {point.Y}");
  • 輕量多值回傳,避免 out 參數或自訂類別
  • ValueTuple 為結構(值型別),Tuple 為類別(參考型別)

5. 可為 null 的值型別 Nullable<T> (T?)

int? count = null;  // Nullable<int>
if (count.HasValue) Console.WriteLine(count.Value);
  • 為值型別加上「無值」狀態
  • 適用於資料庫欄位、選用參數

二、參考型別 — 儲存記憶體位址

實際資料在 Heap,變數持有參考。指派 = 複製參考(指向同一物件)。

  • class:類別
  • string:字串(不可變,特殊參考型別)
  • array:陣列
  • delegate:委派
  • interface:介面
  • object:所有型別基底
  • dynamic:動態型別

記憶體模型圖解

Stack (執行緒專屬,LIFO,自動管理)
├── 區域值型別變數 (int, struct, enum, Tuple)
├── 區域參考型別變數 (指向 Heap 物件的指標)
└── 方法呼叫框架 (參數、返回位址)

Heap (共用、GC 管理)
├── 類別實例
├── 陣列
├── 字串
├── 委派實例
└── 箱裝後的值型別 (boxing)

核心機制:裝箱與拆箱

int i = 123;
object o = i;        // 裝箱:值型別 → 參考型別 (Heap 配置、複製值)
int j = (int)o;      // 拆箱:參考型別 → 值型別 (驗證型別、複製值)

// 效能影響:頻繁裝箱產生 GC 壓力
List<object> list = new List<object>();
for (int k = 0; k < 10000; k++) list.Add(k);  // 10000 次裝箱!

// 解法:用 List<int> 或泛型避免裝箱

型別選擇決策樹

  1. 是否需繼承/多型? → 是 → class
  2. 否 → 是否小型、不可變、高頻、值語意? → 是 → struct/record struct (C# 10)
  3. 否 → 是否具名常數集合? → 是 → enum
  4. 否 → 多值暫時組合? → Tuple/ValueTuple
  5. 否 → 參考型別語意? → class/record (C# 9)

給 C/C++ 開發者的關鍵提醒

  • 無全域變數/函數,一切在類別/結構內
  • struct 預設 public,類別預設 internal
  • 結構不可定義無參建構函式(舊版本)
  • 參考型別預設 null,值型別預設零值
  • 統一用 . 存取成員,無 ->/::

總結

C# 型別系統以值/參考二分為核心,簡單型別、結構、列舉、Tuple 構建值型別家族,類別、字串、陣列、委派構建參考型別家族。理解記憶體模型、裝箱拆箱、指派語意差異,是寫出高效正確 C# 代碼的基石。

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