小編給大家分享一下C#中枚舉特性FlagAttribute的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)建站致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷,提供成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷、小程序設(shè)計(jì)、公眾號(hào)商城、等建站開發(fā),創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。FlagAttribute是什么?
Flag 特性微軟的解釋是:指示可以將枚舉作為位域(即一組標(biāo)志)處理,F(xiàn)lagsAttribute屬性就是枚舉類型的一項(xiàng)可選屬性,它的主要作用是可以將枚舉作為位域處理(P.S. C#不支持位域)。所謂位域是單個(gè)存儲(chǔ)單元內(nèi)相鄰二進(jìn)制位的集合。通過為枚舉添加這個(gè)屬性,可以改變枚舉的一些行為來滿足我們的需要。
比如我們有如下枚舉的定義:
public enum OrderTypeEnum { Init, Complete, Waiting, Paid }
邏輯或操作我相信大家都比較熟悉了,對(duì)于整數(shù)來說,| 操作就是將其轉(zhuǎn)化為二進(jìn)制再進(jìn)行或運(yùn)算。OrderTypeEnum.Init | OrderTypeEnum.Complete做的工作實(shí)際上是 0001 | 0010 = 0011 = 3再轉(zhuǎn)換成(OrderTypeEnum)3就是OrderTypeEnum.Paid了.
如果我們對(duì)兩個(gè)枚舉值做 | 操作,那結(jié)果會(huì)是什么樣呢?
OrderTypeEnum result = OrderTypeEnum.Waiting | OrderTypeEnum.Paid;
按照或操作的原理:0010 | 0011 = 0011(3) Paid ,實(shí)質(zhì)上我們想要的結(jié)果是想講兩個(gè)枚舉值都作為或操作的結(jié)果,但是因?yàn)槊杜e值默認(rèn)是從0開始順次遞增的,那么經(jīng)過或操作之后就得不到我們想要的結(jié)果,那怎么辦呢,這時(shí)候就需要 給枚舉加上 [Flags] 的Attribute,我們先來看一下FlagsAttribute定義的準(zhǔn)則:
使用FlagsAttribute枚舉才是對(duì)數(shù)字值執(zhí)行按位運(yùn)算 (AND、 OR 獨(dú)占或) 的自定義屬性。
在 2 的冪,即 1、 2、 4、 8 等中定義枚舉常量。 這意味著不重疊中組合的枚舉常量的各個(gè)標(biāo)志。
請(qǐng)考慮創(chuàng)建針對(duì)常用的標(biāo)志組合的枚舉的常數(shù)。 例如,如果你有用于文件 I/O 操作的枚舉包含枚舉的常數(shù)Read = 1和Write = 2,請(qǐng)考慮創(chuàng)建枚舉的常數(shù)ReadWrite = Read OR Write,它結(jié)合Read和Write標(biāo)志。 此外,可用于組合標(biāo)志的按位 OR 操作視為在某些情況下,不應(yīng)為用于簡(jiǎn)單任務(wù)所需的一個(gè)高級(jí)的概念。
如果為標(biāo)志枚舉常量中定義為負(fù)數(shù),因?yàn)楹芏鄻?biāo)志位置可能會(huì)設(shè)置為 1,這可能會(huì)使你的代碼的混亂,并鼓勵(lì)編碼錯(cuò)誤,請(qǐng)務(wù)必小心。
測(cè)試是否在數(shù)值中設(shè)置一個(gè)標(biāo)志一種簡(jiǎn)便方式是執(zhí)行按位,操作之間的數(shù)字值和標(biāo)志枚舉的常數(shù),它將所有位都設(shè)置為不對(duì)應(yīng)于標(biāo)志的零的數(shù)字值中,然后測(cè)試該操作的結(jié)果是否等于該標(biāo)志枚舉常量。
使用None用作枚舉其值為零的常量的標(biāo)志名稱。 不能使用None按位運(yùn)算中,來測(cè)試一個(gè)標(biāo)志,因?yàn)榻Y(jié)果始終為零的枚舉的常數(shù)。 但是,你可以執(zhí)行的邏輯不之間的數(shù)字值的按位、 比較和None枚舉的常量,以確定是否已設(shè)置在數(shù)值中的任何位。
如果你創(chuàng)建而不是標(biāo)志枚舉的值枚舉,它是仍必要?jiǎng)?chuàng)建None枚舉的常數(shù)。 原因是,默認(rèn)情況下用于枚舉的內(nèi)存初始化為零的公共語(yǔ)言運(yùn)行時(shí)。 因此,如果未定義其值為零的常量,枚舉將包含在創(chuàng)建時(shí)非法值。
如果你的應(yīng)用程序需要表示明顯默認(rèn)情況下,請(qǐng)考慮使用其值為零表示默認(rèn)值的枚舉的常數(shù)。 如果沒有任何默認(rèn)情況下,請(qǐng)考慮使用其值為零的枚舉的常數(shù)意味著不由任何其他枚舉常量表示這種情況。
未定義一個(gè)枚舉值,只是為了鏡像與枚舉本身的狀態(tài)。 例如,不定義僅用于枚舉的結(jié)束標(biāo)記的枚舉的常數(shù)。 如果你需要確定在枚舉的最后一個(gè)值,請(qǐng)顯式檢查該值。 此外,你可以執(zhí)行范圍檢查第一個(gè)和最后一個(gè)枚舉常量,如果范圍內(nèi)的所有值都是有效。
不要指定保留供將來使用的枚舉的常數(shù)。
當(dāng)你定義的方法或?qū)傩?,它采用作為值的枚舉的常數(shù)時(shí),請(qǐng)考慮驗(yàn)證值。 原因是,即使該數(shù)值不在枚舉中定義,你可以強(qiáng)制轉(zhuǎn)換為枚舉類型的數(shù)字值。
我們看到第二句告訴我們當(dāng)加了Flags的特性之后默認(rèn)的枚舉值就會(huì)以2的冪一次遞增,比如 20,21,22,23(1,2,4,8....)
那我們重新看一下重新定義之后的或操作會(huì)是什么結(jié)果呢?
[Flags] public enum OrderTypeEnum { Init, Complete, Waiting, Paid }
此時(shí)我們?cè)賮砜矗篛rderTypeEnum result = OrderTypeEnum.Complete | OrderTypeEnum.Waiting | OrderTypeEnum.Paid ;
0010 | 0100 | 1000 = 1110 我們可以看到實(shí)質(zhì)上就是做了二進(jìn)制的或運(yùn)算,將所有位值做了合并
當(dāng)我們可以用做位運(yùn)算的時(shí)候,就不僅僅是或,與,非,異或等操作都可以實(shí)現(xiàn)。
我們知道通過這樣可以把枚舉值合并 OrderTypeEnum result = OrderTypeEnum.Complete | OrderTypeEnum.Waiting | OrderTypeEnum.Paid ;
那么同理也可以來判斷這樣的集合中是否包含某個(gè)枚舉值:
result.HasFlag(OrderTypeEnum.Paid)
枚舉通過添加Flags的特性使得它能夠擁有位運(yùn)算的能力,更方便了我們?cè)偃粘4a中的使用。
以上是“C#中枚舉特性FlagAttribute的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都做網(wǎng)站行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。