首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# Enum 設計指南:FlagsAttribute、位元運算與實用技巧

     編輯:關於C#

為什麼要用 FlagsAttribute?

當列舉值需要進行位元運算(AND、OR、XOR)組合時,必須加上 [Flags] 屬性。這讓編譯器與工具(如 Visual Studio 偵錯視窗、ToString())正確識別並顯示組合值。

核心設計原則

  1. 值必須是 2 的冪次(1, 2, 4, 8...),確保位元不重疊。
  2. 提供常用組合常數,如 ReadWrite = Read | Write,簡化呼叫端程式碼。
  3. 避免負數值,因負數二進位高位全為 1,易造成混淆與錯誤。
  4. 定義 None = 0:代表「無旗標」。雖不能用 (value & None) == None 檢測,但可用 value == None 判斷是否無旗標。
  5. 預設值語意:若有明確預設情況,用 0 表示;否則 0 代表「未指定/無效」。
  6. 不要定義無意義值(如僅標記結尾的 Last),改用範圍檢查。
  7. 驗證輸入值:方法接受 enum 參數時,應檢查 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],即能設計出清晰、安全、易維護的旗標列舉。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved