枚舉Enum 全稱(Enumeration),即一種由一組稱爲枚舉數列表的命名常量組成的獨特類型。能夠看出枚舉的出現時爲了使咱們能夠在程序中方便的使用一些特定值的常量,通常的使用你們都比較熟悉,本文主要介紹枚舉的特性 FlagAttribute。測試
Flag 特性微軟的解釋是:指示能夠將枚舉做爲位域(即一組標誌)處理,FlagsAttribute屬性就是枚舉類型的一項可選屬性,它的主要做用是能夠將枚舉做爲位域處理(P.S. C#不支持位域)。所謂位域是單個存儲單元內相鄰二進制位的集合。經過爲枚舉添加這個屬性,能夠改變枚舉的一些行爲來知足咱們的須要。編碼
好比咱們有以下枚舉的定義:spa
public enum OrderTypeEnum { Init, Complete, Waiting, Paid }
邏輯或操做我相信你們都比較熟悉了,對於整數來講,| 操做就是將其轉化爲二進制再進行或運算。OrderTypeEnum.Init | OrderTypeEnum.Complete作的工做其實是 0001 | 0010 = 0011 = 3再轉換成(OrderTypeEnum)3就是OrderTypeEnum.Paid了.blog
若是咱們對兩個枚舉值作 | 操做,那結果會是什麼樣呢?內存
OrderTypeEnum result = OrderTypeEnum.Waiting | OrderTypeEnum.Paid;
按照或操做的原理:0010 | 0011 = 0011(3) Paid ,實質上咱們想要的結果是想講兩個枚舉值都做爲或操做的結果,可是由於枚舉值默認是從0開始順次遞增的,那麼通過或操做以後就得不到咱們想要的結果,那怎麼辦呢,這時候就須要 給枚舉加上 [Flags] 的Attribute,咱們先來看一下FlagsAttribute定義的準則:get
咱們看到第二句告訴咱們當加了Flags的特性以後默認的枚舉值就會以2的冪一次遞增,好比 20,21,22,23(1,2,4,8....)it
那咱們從新看一下從新定義以後的或操做會是什麼結果呢?io
[Flags] public enum OrderTypeEnum { Init, Complete, Waiting, Paid }
此時咱們再來看:OrderTypeEnum result = OrderTypeEnum.Complete | OrderTypeEnum.Waiting | OrderTypeEnum.Paid ;class
0010 | 0100 | 1000 = 1110 咱們能夠看到實質上就是作了二進制的或運算,將全部位值作了合併原理
當咱們能夠用作位運算的時候,就不只僅是或,與,非,異或等操做均可以實現。
咱們知道經過這樣能夠把枚舉值合併 OrderTypeEnum result = OrderTypeEnum.Complete | OrderTypeEnum.Waiting | OrderTypeEnum.Paid ;
那麼同理也能夠來判斷這樣的集合中是否包含某個枚舉值:
result.HasFlag(OrderTypeEnum.Paid)
枚舉經過添加Flags的特性使得它可以擁有位運算的能力,更方便了咱們再平常代碼中的使用。
參考資料:http://www.alanzucconi.com/2015/07/26/enum-flags-and-bitwise-operators/