當列舉值需要進行位元運算(AND、OR、XOR)組合時,必須加上 [Flags] 屬性。這讓編譯器與工具(如 Visual Studio 偵錯視窗、ToString())正確識別並顯示組合值。
ReadWrite = Read | Write,簡化呼叫端程式碼。(value & None) == None 檢測,但可用 value == None 判斷是否無旗標。Last),改用範圍檢查。Enum.IsDefined,防止非法整數強轉。利用 All 常數與 XOR 運算:
[Flags]
public enum Permission
{
Select = 1,
Edit = 2,
Delete = 4,
View = 8,
All = Select | Edit | Delete | View // 15
}
public static Permission ClearFlag(Permission value, Permission flag)
{
// value & (All ^ flag) 等同 value & ~flag
return value & (Permission.All ^ flag);
}
// 使用範例
Permission p = Permission.All; // 15 (Select|Edit|Delete|View)
p = ClearFlag(p, Permission.Delete); // 移除 Delete -> 11 (Select|Edit|View)
// 檢測是否包含特定旗標
bool hasEdit = (permission & Permission.Edit) == Permission.Edit;
// 檢測是否為 None
bool isNone = permission == Permission.None;
遵循「2 的冪次、定義 None、提供常用組合、驗證輸入」四大原則,配合 [Flags],即能設計出清晰、安全、易維護的旗標列舉。