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

C# Enum 設計與位運算實戰技巧完整指南

     編輯:關於C語言

FlagsAttribute 與 Enum 設計準則

核心規則

  1. **僅在需位運算 (AND/OR/XOR) 時** 使用 [Flags]
  2. 枚舉值用 **2 的冪次** (1, 2, 4, 8...) 確保位不重疊
  3. 考慮提供**常用組合常量**:ReadWrite = Read | Write
  4. **謹慎使用負數** 作為旗標值(易混淆、易出錯)
  5. 測試旗標是否設置:(value & flag) == flag
  6. 零值命名為 None;邏輯比較用 (value & None) != 0 檢測是否有旗標
  7. 非旗標枚舉也建議定義 None = 0(CLR 預設初始化為 0)
  8. 零值可表示「預設情況」或「無對應狀態」
  9. **不要**定義僅反映枚舉自身狀態的值(如標記末尾)
  10. **不要**保留未來用的枚舉值
  11. 方法/屬性接受枚舉時,**驗證有效性**(可強制轉型繞過定義)

實戰範例:權限系統


[Flags]
public enum Permission
{
    None = 0,
    Select = 1,      // 0001
    Edit = 2,        // 0010
    Delete = 4,      // 0100
    View = 8,        // 1000
    ReadWrite = Select | Edit,     // 0011 = 3
    FullControl = Select | Edit | Delete | View  // 1111 = 15
}

技巧 1:移除特定旗標


public static Permission ClearFlag(Permission value, Permission flag)
{
    // value & (All ^ flag) 等價於 value & ~flag
    return value & (Permission.FullControl ^ flag);
}

// 使用範例
Permission p = Permission.FullControl;  // 15
p = ClearFlag(p, Permission.Delete);    // 移除 Delete (4) → 11 (Select|Edit|View)

技巧 2:檢測旗標


// 位運算檢測(推薦)
bool hasEdit = (p & Permission.Edit) == Permission.Edit;

// 邏輯檢測零值
bool hasAny = p != Permission.None;

技巧 3:遍歷所有旗標


foreach (Permission flag in Enum.GetValues(typeof(Permission)))
{
    if (flag != Permission.None && (p & flag) == flag)
        Console.WriteLine($"Has: {flag}");
}

常見錯誤避坑

錯誤正確
枚舉值用 1,2,3,4用 1,2,4,8 (2的冪次)
用 (value & flag) != 0 檢測用 (value & flag) == flag
[Flags] 用於非位運算枚舉僅位運算需求加 [Flags]
負數作旗標避免負數,改用高位正數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved