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

C# 列舉初始化陷阱深度解析:new() vs 成員、預設值、IL 差異與最佳實踐

     編輯:關於C#

核心問題:兩種初始化方式是否等價?

enum Alignment { Left, Center, Right }

Alignment a = new Alignment();  // 方式 1
Alignment b = Alignment.Left;   // 方式 2

情況一:第一個成員值為 0(預設)

輸出均為 0。IL 碼完全相同(ldc.i4.0),以下四寫法等價:

Alignment a = new Alignment();
Alignment b = Alignment.Left;
Alignment c = (Alignment)0;
Alignment d = 0;

情況二:第一個成員值非 0

enum Alignment { Left = 1, Center, Right }

輸出差異:

new Alignment()  → 0
Alignment.Left   → 1

IL 差異僅在 ldc.i4.0 vs ldc.i4.1。編譯器識別 Alignment.Left 並嵌入其常值;new Alignment() 始終產生底層型別預設值 0。

值型別預設建構函式機制

new EnumType() 呼叫值型別無參預設建構函式,由 CLR 自動提供,將所有位元歸零。對應預設值規則:

分類預設值
簡單型別0, false, '\0', 0.0 等
列舉型別底層整數 0(隱式轉換)
結構型別所有值型別欄位歸零,參考型別欄位 null

列舉預設值的三種情境

  1. 含 0 值成員:new Enum() 對應該成員(如 Center = 0)。
  2. 無 0 值成員:new Enum() 產生「未定義值」(如 (Alignment)0),ToString() 顯示數字。
  3. 多個 0 值成員:new Enum() 與 Enum.GetName(typeof(Enum), 0) 一致,回傳排序後第一個 0 值成員(如 Left)。

最佳實踐建議

  • 避免使用 new Enum():語意模糊,易產生未定義值。
  • 明確指定成員:Alignment a = Alignment.Left; 清楚表達意圖。
  • 設計列舉時:
    • 第一個成員預設為 0(None/Default),符合預設值語意。
    • 標記 [Flags] 時,成員值為 2 的冪次,0 保留為 None。
  • 檢查未定義值:Enum.IsDefined(typeof(Alignment), value)。

結論

列舉本質是具名常數集合,代表領域分類。初始化應顯式指定成員,而非依賴預設建構函式的零值行為,避免語意模糊與執行期驚喜。

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