亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中枚舉的特性 FlagAttribute詳解

2019-10-29 21:02:55
字體:
來源:轉載
供稿:網友

寫在前面

枚舉Enum 全稱(Enumeration),即一種由一組稱為枚舉數列表的命名常量組成的獨特類型??梢钥闯雒杜e的出現時為了使我們可以在程序中方便的使用一些特定值的常量,一般的使用大家都比較熟悉,本文主要介紹枚舉的特性 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定義的準則:

  1. 使用FlagsAttribute枚舉才是對數字值執行按位運算 (AND、 OR 獨占或) 的自定義屬性。
  2. 在 2 的冪,即 1、 2、 4、 8 等中定義枚舉常量。 這意味著不重疊中組合的枚舉常量的各個標志。
  3. 請考慮創建針對常用的標志組合的枚舉的常數。 例如,如果你有用于文件 I/O 操作的枚舉包含枚舉的常數Read = 1和Write = 2,請考慮創建枚舉的常數ReadWrite = Read OR Write,它結合Read和Write標志。 此外,可用于組合標志的按位 OR 操作視為在某些情況下,不應為用于簡單任務所需的一個高級的概念。
  4. 如果為標志枚舉常量中定義為負數,因為很多標志位置可能會設置為 1,這可能會使你的代碼的混亂,并鼓勵編碼錯誤,請務必小心。
  5. 測試是否在數值中設置一個標志一種簡便方式是執行按位,操作之間的數字值和標志枚舉的常數,它將所有位都設置為不對應于標志的零的數字值中,然后測試該操作的結果是否等于該標志枚舉常量。
  6. 使用None用作枚舉其值為零的常量的標志名稱。 不能使用None按位運算中,來測試一個標志,因為結果始終為零的枚舉的常數。 但是,你可以執行的邏輯不之間的數字值的按位、 比較和None枚舉的常量,以確定是否已設置在數值中的任何位。
  7. 如果你創建而不是標志枚舉的值枚舉,它是仍必要創建None枚舉的常數。 原因是,默認情況下用于枚舉的內存初始化為零的公共語言運行時。 因此,如果未定義其值為零的常量,枚舉將包含在創建時非法值。
  8. 如果你的應用程序需要表示明顯默認情況下,請考慮使用其值為零表示默認值的枚舉的常數。 如果沒有任何默認情況下,請考慮使用其值為零的枚舉的常數意味著不由任何其他枚舉常量表示這種情況。
  9. 未定義一個枚舉值,只是為了鏡像與枚舉本身的狀態。 例如,不定義僅用于枚舉的結束標記的枚舉的常數。 如果你需要確定在枚舉的最后一個值,請顯式檢查該值。 此外,你可以執行范圍檢查第一個和最后一個枚舉常量,如果范圍內的所有值都是有效。
  10. 不要指定保留供將來使用的枚舉的常數。
  11. 當你定義的方法或屬性,它采用作為值的枚舉的常數時,請考慮驗證值。 原因是,即使該數值不在枚舉中定義,你可以強制轉換為枚舉類型的數字值。

我們看到第二句告訴我們當加了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/


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲自拍偷拍色图| 国产精品毛片a∨一区二区三区|国| 日韩欧美国产成人| 92国产精品久久久久首页| 成人动漫网站在线观看| 亚洲无亚洲人成网站77777| 国产成人免费av电影| 最近免费中文字幕视频2019| 97视频国产在线| 一本大道久久加勒比香蕉| 国产精品流白浆视频| 久久精品一区中文字幕| 亚洲字幕在线观看| 国产精品永久免费观看| 久久成年人免费电影| 久久精品99久久香蕉国产色戒| 亚洲一区二区自拍| 亚洲国产小视频| 最新国产精品拍自在线播放| 欧美激情一区二区三级高清视频| 国产精品免费一区| 国内精品视频久久| 国产欧美va欧美va香蕉在| 欧美电影在线观看| 亚洲视频在线观看视频| 高清欧美一区二区三区| 久久天天躁狠狠躁夜夜av| 韩国19禁主播vip福利视频| 国产成人一区二区| 亚洲欧洲国产精品| 欧美夫妻性生活视频| 欧美成人免费大片| 欧美极品少妇xxxxⅹ免费视频| 亚洲最大成人网色| 国产小视频国产精品| 国产一区二区三区久久精品| www日韩欧美| 日韩最新在线视频| 国产欧美最新羞羞视频在线观看| 色www亚洲国产张柏芝| 亚洲精品久久久久国产| 国产亚洲精品激情久久| 欧美亚洲国产视频小说| 懂色aⅴ精品一区二区三区蜜月| 亚洲国产中文字幕在线观看| 亚洲欧美日韩成人| 色播久久人人爽人人爽人人片视av| 国产suv精品一区二区三区88区| 国产一区二区三区在线| 欧美激情久久久| 亚洲男人天堂2019| 96sao精品视频在线观看| 亚洲国产成人精品女人久久久| 亚洲精品久久视频| 亚洲理论片在线观看| 久久人人爽人人爽爽久久| 成人激情视频在线| 亚洲欧洲免费视频| 欧美精品videos| 欧美日韩免费在线观看| 狠狠久久亚洲欧美专区| 精品国产一区二区三区在线观看| 成人h视频在线观看播放| 国模视频一区二区三区| 色悠久久久久综合先锋影音下载| 亚洲的天堂在线中文字幕| 久久九九免费视频| 疯狂做受xxxx高潮欧美日本| 国产精品福利网| 国产精品成人av性教育| 97香蕉久久超级碰碰高清版| 91精品国产高清久久久久久久久| 欧美国产在线视频| 国产啪精品视频| 欧美午夜www高清视频| 97久久超碰福利国产精品…| 欧美色视频日本高清在线观看| 超碰97人人做人人爱少妇| 国产精品激情自拍| 亚洲码在线观看| 国产精品91久久久| 欧美大成色www永久网站婷| 91成人在线视频| 久久资源免费视频| 日韩网站在线观看| 中日韩午夜理伦电影免费| 岛国视频午夜一区免费在线观看| 国产精品一香蕉国产线看观看| 97碰在线观看| 久久人人爽亚洲精品天堂| 亚洲黄色片网站| 亚洲一区美女视频在线观看免费| 日本精品在线视频| 欧美日韩人人澡狠狠躁视频| 亚洲第一区中文99精品| 国产精品视频播放| 亚洲性av在线| 欧美日韩在线观看视频| 日本午夜人人精品| 亚洲欧洲视频在线| 亚洲精品国产综合区久久久久久久| 琪琪第一精品导航| 亚洲综合日韩中文字幕v在线| 麻豆国产va免费精品高清在线| 亚洲丝袜av一区| 国产精品福利片| 尤物yw午夜国产精品视频| 91亚洲va在线va天堂va国| 精品久久久999| 伊人久久综合97精品| 欧美日本高清一区| 日韩欧美在线视频免费观看| 精品亚洲一区二区三区四区五区| 亚洲欧美精品中文字幕在线| 2019中文在线观看| 国产精品88a∨| 日韩av电影院| 最近2019中文字幕mv免费看| 91国偷自产一区二区三区的观看方式| 日韩精品在线视频美女| 九九热这里只有精品免费看| 国产精品久久久久久久7电影| 亚洲xxx自由成熟| 韩国v欧美v日本v亚洲| 欧美精品久久久久久久久久| 日韩中文娱乐网| 色婷婷综合久久久久中文字幕1| 亚洲一区二区三| 亚洲第一页中文字幕| 2019中文字幕在线观看| 久久久久久国产精品| 久久九九全国免费精品观看| 久久久国产视频| 久久久久北条麻妃免费看| 97超碰国产精品女人人人爽| 亚洲最大福利视频网站| 永久免费毛片在线播放不卡| 国产在线日韩在线| 亚洲欧洲xxxx| 国产美女被下药99| 91国产高清在线| 91高清免费视频| 国产亚洲精品久久久久动| 国内伊人久久久久久网站视频| 91精品国产电影| 国产精品视频自拍| 国产+成+人+亚洲欧洲| 欧美亚洲国产另类| 日韩欧美在线视频日韩欧美在线视频| 神马国产精品影院av| 亚洲国内精品视频| 欧日韩不卡在线视频| 久久久久久国产精品| 亚洲四色影视在线观看| 精品中文字幕在线2019| 国产精品成人va在线观看| 亚洲娇小xxxx欧美娇小| 国产一区二中文字幕在线看| 欧美有码在线视频| 欧美性极品xxxx娇小| 欧美性猛交xxxx免费看| 国产一区私人高清影院| 国产精品视频免费在线观看| 欧美日韩免费区域视频在线观看|