基本宣告與用法
using System;
class Test
{
// 指定底層型別為 byte,節省記憶體
enum Color : byte { Red = 6, Green = 8, Blue = 10 }
static string StringFromColor(Color color) => color.ToString();
static void Main()
{
Color c = Color.Red;
Console.WriteLine(c); // Red
Console.WriteLine(StringFromColor(c)); // Red
Console.WriteLine((int)c); // 6
}
}
核心特性
- 型別安全:
Color c = 5; 編譯錯誤,需強制轉型 (Color)5。
- 底層整數型別:可指定
byte, sbyte, short, ushort, int, uint, long, ulong,預設 int。
- 隱含值遞增:未指定值時從 0 開始,每項 +1。
- ToString():輸出常數名稱("Red"),非數值。
- Flags 屬性:標記為位元旗標,支援位元運算組合。
Flags 列舉:位元旗標完整範例
[Flags]
enum FileAccess : byte
{
None = 0,
Read = 1, // 0001
Write = 2, // 0010
Execute = 4, // 0100
ReadWrite = Read | Write, // 0011 = 3
All = Read | Write | Execute // 0111 = 7
}
var access = FileAccess.Read | FileAccess.Write; // 組合
bool canRead = (access & FileAccess.Read) != 0; // 檢查
access &= ~FileAccess.Write; // 移除 Write
Console.WriteLine(access); // Read (Flags 屬性讓 ToString 輸出 "Read, Write")
常用靜態方法
| 方法 | 用途 | 範例 |
| Enum.IsDefined | 檢查值是否定義於列舉 | Enum.IsDefined(typeof(Color), 6) → true |
| Enum.GetNames | 取得所有常數名稱陣列 | Enum.GetNames(typeof(Color)) → ["Red","Green","Blue"] |
| Enum.GetValues | 取得所有常數值陣列 | Enum.GetValues(typeof(Color)) → [6,8,10] |
| Enum.Parse | 字串轉列舉值(大小寫敏感) | Enum.Parse(typeof(Color), "Red") → Color.Red |
| Enum.TryParse | 安全轉換,不拋出異常 | Enum.TryParse("Green", out Color c) |
最佳實踐建議
- 預設用
int,大量實例或記憶體敏感才指定 byte/short。
- 互斥選項用一般列舉;可組合選項加
[Flags] 並設 2 的冪次值。
- 避免負數值(除非特殊互通需求),位元運算易出錯。
- 公開 API 的列舉加上
[Flags] 並文件化組合語意。
- C# 11+
Enum.GetValues<T>() 型別安全泛型版本。