C# 中的 [Flags] 枚舉屬性:理解其作用
在 C# 中定義枚舉時,如果枚舉表示的是值的集合而非單個值,則可以使用 [Flags] 屬性。此屬性在使用按位運算符的枚舉中特別有用。
[Flags] 屬性的重要性
與普遍的誤解相反,[Flags] 屬性僅僅通過 .ToString()
方法提供更易讀的表示形式。使用 [Flags] 標記的枚舉將輸出其值,值以逗號分隔的標誌名稱列表形式顯示,如下所示:
enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 } [Flags] enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 } ... var str1 = (Suits.Spades | Suits.Diamonds).ToString(); // "5" var str2 = (SuitsFlags.Spades | SuitsFlags.Diamonds).ToString(); // "Spades, Diamonds"
2 的冪值
必須強調的是,[Flags] 屬性不會自動將 2 的冪值賦給枚舉。如果跳過數值賦值,則按位運算中的枚舉行為將不正確,因為默認值從 0 開始遞增。
正確的聲明:
[Flags] public enum MyColors { Yellow = 1, Green = 2, Red = 4, Blue = 8 }
獲取不同的值:
要檢索枚舉屬性中的不同值,可以使用多種方法:
使用 .HasFlag()
(.NET 4 及更高版本可用):
if (myProperties.AllowedColors.HasFlag(MyColor.Yellow)) { // Yellow is allowed... }
使用按位運算符(.NET 4 之前):
if ((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow) { // Yellow is allowed... }
底層機制
[Flags] 屬性允許通過按位運算符操作二進制值。通過將 2 的冪值作為枚舉值,值的底層二進製表示允許進行高效且有意義的按位運算。
例如,如果屬性 AllowedColors 使用二進制按位或 | 運算符賦值為 Red、Green 和 Blue,則 AllowedColors 將保存二進制值 00001110。
None = 0 值
在某些枚舉中,包含 0 值(通常命名為“None”)。但是,需要注意的是,涉及 None 值的按位與 & 運算始終返回 0,因此不適合用於測試特定標誌。可以改用邏輯比較。
有關 [Flags] 屬性、其用法和設計模式的更多信息和資源,請參閱 MSDN 文檔。
以上是c#[flags]枚舉如何增強位置操作和枚舉可讀性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!