C# 列舉:具名常數集合的型別安全封裝
列舉 (enum) 為一組相關常數定義統一型別,提供語意清晰、編譯期檢查、IntelliSense 支援等優勢。
基本定義與使用
enum Color {
Red,
Blue,
Green
}
class Shape {
public void Fill(Color color) {
switch (color) {
case Color.Red: /* ... */ break;
case Color.Blue: /* ... */ break;
case Color.Green: /* ... */ break;
default: break;
}
}
}
底層型別與數值控制
// 預設底層型別 int,從 0 遞增
enum Color { Red, Blue, Green } // Red=0, Blue=1, Green=2
// 指定底層型別
enum Priority : byte { Low, Medium, High, Critical }
// 手動指定數值
enum HttpStatus {
OK = 200,
NotFound = 404,
ServerError = 500
}
// 位元旗標模式 (FlagsAttribute)
[Flags]
enum FileAccess {
None = 0,
Read = 1,
Write = 2,
Execute = 4,
ReadWrite = Read | Write // 3
}
列舉核心操作
| 操作 | 語法 | 範例 |
| 轉字串 | color.ToString() | "Red" |
| 轉數值 | (int)color | 0 |
| 字串轉列舉 | Enum.Parse<Color>("Red") | Color.Red |
| 檢查定義 | Enum.IsDefined<Color>(value) | true/false |
| 取得所有值 | Enum.GetValues<Color>() | Color[] |
| 位元運算 | access & FileAccess.Read | != 0 表示有讀取權限 |
列舉 vs 常數:優勢比較
| 特性 | const int | enum |
| 型別安全 | 無 (皆為 int) | 強型別 |
| 分組相關常數 | 靠命名慣例 | 語言層級 |
| IDE 提示 | 無 | 完整 IntelliSense |
| switch 完整性檢查 | 無 | 編譯器警告缺漏 case |
| 位元旗標支援 | 手動管理 | [Flags] 標準化 |
最佳實踐
- 預設使用
int 底層型別,除非記憶體極度敏感
- 列舉名稱用單數 (
Color 非 Colors)
- 成員用 PascalCase
- 提供
None = 0 作為預設值
- 位元旗標務必加
[Flags] 屬性
- 避免在公開 API 頻繁變更列舉成員 (破壞二進位相容)
進階:模式比對 (C# 7.0+)
string GetColorName(Color c) => c switch {
Color.Red => "紅色",
Color.Blue => "藍色",
Color.Green => "綠色",
_ => "未知"
};