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

C# 列舉型別:命名常數、底層型別、Flags 屬性、位元運算與最佳實務

     編輯:關於C語言

列舉本質:具名常數集合

列舉讓數值擁有語意名稱,提升可讀性與型別安全:

enum WeekDay
{
    Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}

WeekDay day = WeekDay.Tuesday;  // 型別安全,不可指派任意整數

底層型別與預設值

  • 預設底層型別:int
  • 第一個成員 = 0,後續遞增 1
  • 可指定底層型別:byte、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 屬性:位元旗標組合

[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"

進階:C# 7.0+ 模式比對

switch (day)
{
    case WeekDay.Saturday:
    case WeekDay.Sunday:
        Console.WriteLine("週末");
        break;
    case WeekDay d when d >= WeekDay.Monday && d <= WeekDay.Friday:
        Console.WriteLine("平日");
        break;
}

設計準則

  1. 單一值列舉勿加 [Flags]
  2. [Flags] 列舉必須用 2 的冪次值
  3. 提供 None = 0 成員
  4. 避免負數值(除非特殊需求)
  5. 公開 API 考慮 Enum.IsDefined 驗證輸入

總結

列舉以型別安全包裝整數常數,[Flags] 啟用位元組合語意。善用 Enum.TryParse、模式比對提升健壯性,底層型別選擇平衡記憶體與範圍。

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