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

C# 資料型別完整指南:實值/參考/指標型別、型別系統、預設值、sizeof 與選擇指南

     編輯:C# 入門

C# 資料型別完整指南:實值/參考/指標型別、型別系統、預設值、sizeof 與選擇指南

C# 是強型別語言,每個變數、運算式、方法參數/回傳值都有固定型別。理解型別分類、記憶體模型、預設值、大小、轉換規則,是寫出高效、正確程式碼的基礎。

型別分類總覽

分類型別範例基底類別記憶體指派Null
實值型別int, double, bool, struct, enum, DateTimeSystem.ValueType堆疊/內嵌複製值不可 (除非 T?)
參考型別class, string, array, delegate, interfaceSystem.Object堆積複製參考可
指標型別int*, void*, Span<T>*—堆疊複製位址可

內建實值型別完整表

型別別名大小範圍 / 精度預設值
System.SBytesbyte1 byte-128 ~ 1270
System.Bytebyte1 byte0 ~ 2550
System.Int16short2 bytes-32,768 ~ 32,7670
System.UInt16ushort2 bytes0 ~ 65,5350
System.Int32int4 bytes-2,147,483,648 ~ 2,147,483,6470
System.UInt32uint4 bytes0 ~ 4,294,967,2950
System.Int64long8 bytes-9.22e18 ~ 9.22e180L
System.UInt64ulong8 bytes0 ~ 1.84e190UL
System.Singlefloat4 bytes±1.5e-45 ~ ±3.4e38, ~7 位數0.0F
System.Doubledouble8 bytes±5.0e-324 ~ ±1.7e308, ~15 位數0.0D
System.Decimaldecimal16 bytes±1.0e-28 ~ ±7.9e28, 28-29 位數0.0M
System.Booleanbool1 bytetrue/falsefalse
System.Charchar2 bytesU+0000 ~ U+FFFF'\0'
System.DateTime—8 bytes0001-01-01 ~ 9999-12-31DateTime.MinValue
System.Guid—16 bytes128-bit 唯一識別碼Guid.Empty

sizeof 運算子

// 編譯期常數 (內建型別)
int size = sizeof(int);        // 4
int size2 = sizeof(DateTime);  // 8

// 結構體需 unsafe context (除非無參考欄位)
unsafe { int size3 = sizeof(MyStruct); }

參考型別詳解

object:所有型別的終極基底

object o = 42;       // 裝箱
object o2 = "hello";
object o3 = new int[] {1,2,3};
// 所有型別 (含實值型別裝箱後) 皆可指派給 object

dynamic:延遲繫結

dynamic d = "hello";
Console.WriteLine(d.Length); // 執行期解析,失敗拋 RuntimeBinderException
d = 42;
Console.WriteLine(d * 2); // 執行期解析
// 編譯期不檢查成員存取,類似動態語言

string:不可變字串

string s = "hello";
string s2 = @"C:\Path"; // 逐字字串
string s3 = $"{DateTime.Now}"; // 插值字串
// string 為參考型別,但行為類似值型別 (不可變、== 比較內容)

陣列、委派、介面

  • 陣列:int[], string[,] 隱含繼承 System.Array
  • 委派:Action, Func<T, TResult>, 自訂委派
  • 介面:IEnumerable<T>, IDisposable 等

指標型別與不安全程式碼

僅在 unsafe 內容使用,直接操作記憶體位址:

unsafe {
    int i = 42;
    int* p = &i;          // 取得位址
    Console.WriteLine(*p); // 解參考
    
    int[] arr = {1,2,3};
    fixed (int* ptr = arr) { // 固定陣列不被 GC 移動
        for (int j = 0; j < 3; j++) Console.WriteLine(ptr[j]);
    }
}

用途:高效能互通、圖形處理、網路封包解析、與 C/C++ 互操作。現代替代方案:Span<T>, Memory<T>, Unsafe 類別。

型別系統核心概念

共同類型系統 (CTS)

定義所有 .NET 語言共用的型別規範:實值/參考型別、繼承規則、成員類型、存取修飾詞。

共同語言規範 (CLS)

CTS 子集,確保跨語言互操作:不使用無號整數、區分大小寫成員名、無指標等。

型別安全

編譯期 + 執行期防止型別錯誤:存取不存在成員、錯誤轉換、陣列越界皆會被攔截。

預設值與初始化

情境實值型別參考型別
欄位/陣列元素全零 (0/false/\0)null
區域變數需明確初始化需明確初始化
default(T)全零null
new T()呼叫無參數建構子呼叫建構子

型別選擇指南

場景推薦型別理由
整數計數/索引intCPU 原生、效能最佳、預設推斷
大整數/識別碼long / Guid範圍足夠、唯一性
金額/財務計算decimal十進位精確、避免浮點誤差
科學計算/測量double範圍大、硬體加速、精度足夠
單精度/圖形/GPUfloat記憶體省、頻寬低、SIMD 友善
布林旗標bool語意明確
單一字元charUTF-16 代碼單元
小型不可變資料readonly struct堆疊配置、複製語意、無 GC
大型/共享/可變物件class / record參考語意、身分識別、繼承
字串文字string不可變、內建優化

可為 Null 型別

// 實值型別包裝
int? nullableInt = null;
bool? flag = null;
DateTime? birthday = null;

// 參考型別 (C# 8+ nullable context)
string? nullableString = null;
List? nullableList = null;

// 底層結構
// public struct Nullable where T : struct {
//     public bool HasValue { get; }
//     public T Value { get; } // HasValue=false 時擲出
// }

最佳實踐

  • 預設用 int/double/bool/string:除非有特定理由 (記憶體、精度、互操作) 才用其他型別。
  • 金額必用 decimal:float/double 會產生 0.1 + 0.2 ≠ 0.3 等誤差。
  • 大型結構體避免當參數傳值:用 in、ref、或改為 class。
  • 啟用 Nullable Context:<Nullable>enable</Nullable> 讓編譯器協助防禦 NullReferenceException。
  • 避免 unsafe/指標:除非效能分析證明必要,優先用 Span<T>/Memory<T>。
  • 理解裝箱成本:熱路徑避免實值型別指派給 object/介面。

常見問題 FAQ

Q: string 是實值型別還是參考型別?

A: 參考型別 (繼承 object),但行為像值型別:不可變、== 比較內容、預設值 null。

Q: 為什麼沒有 sizeof(bool)?

A: bool 在 CLI 規範中大小未指定 (通常 1 byte)。C# 允許 sizeof(bool) 但需 unsafe context。

Q: DateTime 是實值型別嗎?

A: 是,struct,8 bytes (ticks 長整數)。

Q: 什麼時候用 uint/ulong?

A: 位元操作、互通原生 API、CLS 合規性不需求時。公開 API 慣用 int/long。

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