enum Alignment { Left, Center, Right }
Alignment a = new Alignment(); // 方式 1
Alignment b = Alignment.Left; // 方式 2
輸出均為 0。IL 碼完全相同(ldc.i4.0),以下四寫法等價:
Alignment a = new Alignment();
Alignment b = Alignment.Left;
Alignment c = (Alignment)0;
Alignment d = 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 |
new Enum() 對應該成員(如 Center = 0)。new Enum() 產生「未定義值」(如 (Alignment)0),ToString() 顯示數字。new Enum() 與 Enum.GetName(typeof(Enum), 0) 一致,回傳排序後第一個 0 值成員(如 Left)。new Enum():語意模糊,易產生未定義值。Alignment a = Alignment.Left; 清楚表達意圖。None/Default),符合預設值語意。[Flags] 時,成員值為 2 的冪次,0 保留為 None。Enum.IsDefined(typeof(Alignment), value)。列舉本質是具名常數集合,代表領域分類。初始化應顯式指定成員,而非依賴預設建構函式的零值行為,避免語意模糊與執行期驚喜。