C 列舉特性 FlagAttribute 的應用

2022-01-18 16:51:42 字數 1493 閱讀 6380

列舉enum 全稱(enumeration),即一種由一組稱為列舉數列表的命名常量組成的獨特型別。可以看出列舉的出現時為了使我們可以在程式中方便的使用一些特定值的常量,一般的使用大家都比較熟悉,本文主要介紹列舉的特性 flagattribute。

flag 特性微軟的解釋是:指示可以將列舉作為位域(即一組標誌)處理,flagsattribute屬性就是列舉型別的一項可選屬性,它的主要作用是可以將列舉作為位域處理(p.s. c#不支援位域)。所謂位域是單個儲存單元內相鄰二進位制位的集合。通過為列舉新增這個屬性,可以改變列舉的一些行為來滿足我們的需要。

比如我們有如下列舉的定義:

public enum ordertypeenum

邏輯或操作我相信大家都比較熟悉了,對於整數來說,| 操作就是將其轉化為二進位制再進行或運算。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

此時我們再來看: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的特性使得它能夠擁有位運算的能力,更方便了我們再日常**中的使用。

參考資料:

C 列舉中使用Flags特性

如果對乙個值可以包含多個,那麼可以使用列舉,加上flags 在寫前,需要知道一些基礎知識,取反 或 與,如果不知道的話,請去看看基礎。當然,這些太複雜了,我也不會在這裡解釋。假如有型別 flags public enum show 合併多個,使用 show show show.a show.b 乙個...

C 列舉中使用Flags特性

這種用處很大,比如許可權 執行狀態等,都可以用乙個int型儲存到資料庫中,c 中使用列舉可以處理這個問題。flags public enum permission c 對該型別的操作如下 permission permission permission.create permission.read ...

Java 新特性 列舉

package cn.enum.robertchao public enum color1 可以通過 列舉.內容 的形式進行取值操作。2 輸出列舉中的全部內容,可以使用foreach完成。利用foreach把列舉型別中的內容全部取出。package cn.enum.robertchao public...