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

CLR 筆記:列舉類型與位元旗標深度解析

     編輯:關於.NET

12.1 列舉類型基礎

  • 強類型,列舉間不可隱式轉換。
  • 直接繼承 System.Enum → System.ValueType,為值類型,可裝箱/拆箱。
  • 不可定義方法/屬性/事件。
  • 同一列舉多個符號可共享數值;數值轉符號時返回第一個符號。
  • 列舉類型需與使用它的類別在同一層級。
  • 底層類型預設 int,可指定 8 種基元類型(byte, sbyte, short, ushort, int, uint, long, ulong)。
  • 可對列舉使用運算子(實際作用於 value__ 執行個體欄位)。
  • 可顯式轉換為不同列舉類型(先轉數值,再對應另一列舉符號)。
  • 可顯式轉換為數值類型。

IL 視角與常數折疊

列舉在 IL 中為定義一系列常數欄位與執行個體欄位 value__ 的結構。僅使用 Color.Red 等符號時視為常數處理,程式碼不再參考列舉類型,可刪除對應 DLL;若使用 Color c = new Color() 則產生相依性。

列舉常用方法

  1. GetUnderlyingType:取得底層類型。
  2. ToString():支援 "G"(預設)、"D"(十進位)、"X"(十六進位,大寫,位數依底層類型決定)。
  3. Format:功能同 ToString,但允許傳遞數值而非列舉執行個體。
  4. GetValues:返回所有列舉符號組成的陣列。
  5. GetName/GetNames:取得數值對應的字串或陣列。
  6. Parse:符號/數值字串轉列舉執行個體,支援忽略大小寫。
  7. IsDefined:判斷數值/符號是否合法,常用於參數驗證(慎用:區分大小寫、使用反射、速度慢)。
  8. ToObject:將基元類型實例轉為列舉執行個體。

12.2 位元旗標

位元旗標為位元集合(某些位開啟/關閉);列舉為數值(若干值累加)。在列舉套用 [Flags] 屬性,即可用列舉表示可組合的位元旗標,慣例定義 None = 0。

[Flags]
public enum FileAttributes {
    ReadOnly = 0x0001,
    Hidden   = 0x0002,
    System   = 0x0004
}

位元運算應用

  • 邏輯 AND:判斷是否包含某旗標 (attributes & FileAttributes.Hidden) == FileAttributes.Hidden。
  • 邏輯 OR:組合旗標 File.SetAttributes(path, FileAttributes.ReadOnly | FileAttributes.Hidden)。

Flags 列舉的 ToString / Parse 行為

  • ToString:檢查 [Flags] → 無則匹配單一符號;有則取降序數值集合,逐一 AND,匹配者以逗號連接輸出。特殊情況:無法組合出該數值時返回數值;應定義 0。
  • Parse:移除空白 → 以 +/-/數字開頭視為數字直接轉型 → 否則以逗號分割,查找符號數值並 OR 組合。
  • 不可對 Flags 列舉呼叫 IsDefined(字串含逗號永不匹配;數值永回傳 false)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved