列舉讓數值擁有語意名稱,提升可讀性與型別安全:
enum WeekDay
{
Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}
WeekDay day = WeekDay.Tuesday; // 型別安全,不可指派任意整數
intbyte、short、int、long(及無號對應)enum Priority : byte // 節省記憶體
{
Low = 1,
Medium = 2,
High = 3
}
enum HttpStatus
{
OK = 200,
Created = 201,
NoContent = 204,
MovedPermanently = 301,
Found = 302, // 302
Redirect = 302, // 允許重複值(別名)
BadRequest = 400,
Unauthorized = 401,
NotFound = 404
}
HttpStatus.Found == HttpStatus.Redirect 為 true。
[Flags]
enum FileAccess
{
None = 0,
Read = 1, // 2⁰
Write = 2, // 2¹
Execute = 4, // 2²
ReadWrite = Read | Write // 3
}
使用:
FileAccess access = FileAccess.Read | FileAccess.Write;
bool canRead = (access & FileAccess.Read) != 0; // true
access &= ~FileAccess.Write; // 移除 Write
⚠️ Enum.HasFlag() 方便但會裝箱,效能敏感場合用位元運算。
| 方法 | 用途 | 範例 |
|---|---|---|
Enum.GetValues() | 取得所有值陣列 | foreach (WeekDay d in Enum.GetValues(typeof(WeekDay))) |
Enum.GetNames() | 取得所有名稱陣列 | string[] names = Enum.GetNames(typeof(WeekDay)); |
Enum.Parse() | 字串轉列舉 | WeekDay d = (WeekDay)Enum.Parse(typeof(WeekDay), "Monday"); |
Enum.TryParse() | 安全轉換 | Enum.TryParse("Tuesday", out WeekDay d); |
Enum.IsDefined() | 驗證值是否定義 | Enum.IsDefined(typeof(WeekDay), 7); // false |
Enum.GetName() | 值轉名稱 | string name = Enum.GetName(typeof(WeekDay), 1); // "Monday" |
switch (day)
{
case WeekDay.Saturday:
case WeekDay.Sunday:
Console.WriteLine("週末");
break;
case WeekDay d when d >= WeekDay.Monday && d <= WeekDay.Friday:
Console.WriteLine("平日");
break;
}
[Flags][Flags] 列舉必須用 2 的冪次值None = 0 成員Enum.IsDefined 驗證輸入列舉以型別安全包裝整數常數,[Flags] 啟用位元組合語意。善用 Enum.TryParse、模式比對提升健壯性,底層型別選擇平衡記憶體與範圍。