.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