寫在前面
枚舉Enum 全稱(Enumeration),即一種由一組稱為枚舉數列表的命名常量組成的獨特類型。可以看出枚舉的出現時為了使我們可以在程序中方便的使用一些特定值的常量,一般的使用大家都比較熟悉,本文主要介紹枚舉的特性 FlagAttribute。
FlagAttribute是什么?
Flag 特性微軟的解釋是:指示可以將枚舉作為位域(即一組標志)處理,FlagsAttribute屬性就是枚舉類型的一項可選屬性,它的主要作用是可以將枚舉作為位域處理(P.S. C#不支持位域)。所謂位域是單個存儲單元內相鄰二進制位的集合。通過為枚舉添加這個屬性,可以改變枚舉的一些行為來滿足我們的需要。
比如我們有如下枚舉的定義:
public enum OrderTypeEnum{ Init, Complete, Waiting, Paid}
邏輯或操作我相信大家都比較熟悉了,對于整數來說,| 操作就是將其轉化為二進制再進行或運算。OrderTypeEnum.Init | OrderTypeEnum.Complete做的工作實際上是 0001 | 0010 = 0011 = 3再轉換成(OrderTypeEnum)3就是OrderTypeEnum.Paid了.
如果我們對兩個枚舉值做 | 操作,那結果會是什么樣呢?
OrderTypeEnum result = OrderTypeEnum.Waiting | OrderTypeEnum.Paid;
按照或操作的原理:0010 | 0011 = 0011(3) Paid ,實質上我們想要的結果是想講兩個枚舉值都作為或操作的結果,但是因為枚舉值默認是從0開始順次遞增的,那么經過或操作之后就得不到我們想要的結果,那怎么辦呢,這時候就需要 給枚舉加上 [Flags] 的Attribute,我們先來看一下FlagsAttribute定義的準則:
我們看到第二句告訴我們當加了Flags的特性之后默認的枚舉值就會以2的冪一次遞增,比如 20,21,22,23(1,2,4,8....)
那我們重新看一下重新定義之后的或操作會是什么結果呢?
[Flags] public enum OrderTypeEnum { Init, Complete, Waiting, Paid }
此時我們再來看:OrderTypeEnum result = OrderTypeEnum.Complete | OrderTypeEnum.Waiting | OrderTypeEnum.Paid ;
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/
新聞熱點
疑難解答