1. 程式人生 > 實用技巧 >.NET中Flags列舉

.NET中Flags列舉

.NET中Flags列舉

 .NET中的列舉我們一般有兩種用法,一是表示唯一的元素序列,例如一週裡的各天;還有就是用來表示多種複合的狀態。這個時候一般需要為列舉加上[Flags]特性標記為位域,例如:

1 [Flags] 
2 enum Styles
3 { 
4 ShowBorder = 1,
5 ShowCaption = 2,
6 ShowToolbox = 4
7 } 

  這樣我們就可以用"或"運算子組合多個狀態,例如:

1 myControl.Style = Styles.ShowBorder | Styles.ShowCaption; 

  這時myControl.Style列舉的值將變成 1+2=3,它的ToString()將變成"Styles.ShowBorder , Styles.ShowCaption"

這裡我們可以解釋為什麼第三個值ShowToolbox可以為4,5..而不能為3。也就是說它的值不應該是前幾項值的複合值。有一個比較簡單的方法就是用2的n次方來依次為每一項賦值,例如 1,2,4,8,16,32,64.....

現在舉個常見的Flags應用例子。例如一個簡單的許可權系統,有"Admin"和"User"兩種角色,我們可以在表中放一個 varchar()欄位,以文字形式存放許可權字"Admin,User"。但是用Flags型列舉的話,我們就可以直接將 Roles.Admin | Roles.User 的值放在一個int欄位裡。

以下是關於列舉的一些常見操作:
將列舉的值變回列舉物件:
Styles style = (Styles) Enum.Parse(typeof(Styles), 4 );// -> style = Styles.Toolbox;
  檢查列舉是否包含某個元素:
bool hasFlag = ((style & Styles.ShowBorder) != 0);


其實我們還會碰到一種情況,就是需要從組合狀態中去掉一個元素。用"^"運算子可以做到:

1 Styles style = Styles.ShowBorder | Styles.ShowCaption; 
2 style = style ^ Styles.ShowBorder; 

  這個時候style的值就會變成 Styles.ShowCaption

但這裡有一個很嚴重的問題,再執行一次

style = style ^ Styles.ShowBorder; 

style 的值卻又變成了 Styles.ShowBorder | Styles.ShowCaption !! 再執行一遍,又會去掉這個元素,周而復始。
當然我們可以在去掉某個元素前做一番檢查,如果列舉包含這個元素,再去掉它:

1 if ((style & Styles.ShowBorder) != 0)
2 { 
3     style = style ^ Styles.ShowBorder; 
4 } 

  其它方法方便地從Flags列舉狀態中去掉一個元素

1 style = style & (~Styles.ShowBorder) 

參考部落格地址:https://www.cnblogs.com/sunShineJing/articles/2814619.html