最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#中枚舉特性FlagAttribute的示例分析

小編給大家分享一下C#中枚舉特性FlagAttribute的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比馬關網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式馬關網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋馬關地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。

FlagAttribute是什么?

Flag 特性微軟的解釋是:指示可以將枚舉作為位域(即一組標志)處理,F(xiàn)lagsAttribute屬性就是枚舉類型的一項可選屬性,它的主要作用是可以將枚舉作為位域處理(P.S. C#不支持位域)。所謂位域是單個存儲單元內(nèi)相鄰二進制位的集合。通過為枚舉添加這個屬性,可以改變枚舉的一些行為來滿足我們的需要。

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

public enum OrderTypeEnum
{
  Init,
 
  Complete,
 
  Waiting,
 
  Paid
}

邏輯或操作我相信大家都比較熟悉了,對于整數(shù)來說,| 操作就是將其轉(zhuǎn)化為二進制再進行或運算。OrderTypeEnum.Init | OrderTypeEnum.Complete做的工作實際上是 0001 | 0010 = 0011 = 3再轉(zhuǎn)換成(OrderTypeEnum)3就是OrderTypeEnum.Paid了.

如果我們對兩個枚舉值做 | 操作,那結果會是什么樣呢?

OrderTypeEnum result = OrderTypeEnum.Waiting | OrderTypeEnum.Paid;

按照或操作的原理:0010 | 0011 = 0011(3) Paid ,實質(zhì)上我們想要的結果是想講兩個枚舉值都作為或操作的結果,但是因為枚舉值默認是從0開始順次遞增的,那么經(jīng)過或操作之后就得不到我們想要的結果,那怎么辦呢,這時候就需要 給枚舉加上 [Flags] 的Attribute,我們先來看一下FlagsAttribute定義的準則:

  1. 使用FlagsAttribute枚舉才是對數(shù)字值執(zhí)行按位運算 (AND、 OR 獨占或) 的自定義屬性。

  2. 在 2 的冪,即 1、 2、 4、 8 等中定義枚舉常量。 這意味著不重疊中組合的枚舉常量的各個標志。

  3. 請考慮創(chuàng)建針對常用的標志組合的枚舉的常數(shù)。 例如,如果你有用于文件 I/O 操作的枚舉包含枚舉的常數(shù)Read = 1和Write = 2,請考慮創(chuàng)建枚舉的常數(shù)ReadWrite = Read OR Write,它結合Read和Write標志。 此外,可用于組合標志的按位 OR 操作視為在某些情況下,不應為用于簡單任務所需的一個高級的概念。

  4. 如果為標志枚舉常量中定義為負數(shù),因為很多標志位置可能會設置為 1,這可能會使你的代碼的混亂,并鼓勵編碼錯誤,請務必小心。

  5. 測試是否在數(shù)值中設置一個標志一種簡便方式是執(zhí)行按位,操作之間的數(shù)字值和標志枚舉的常數(shù),它將所有位都設置為不對應于標志的零的數(shù)字值中,然后測試該操作的結果是否等于該標志枚舉常量。

  6. 使用None用作枚舉其值為零的常量的標志名稱。 不能使用None按位運算中,來測試一個標志,因為結果始終為零的枚舉的常數(shù)。 但是,你可以執(zhí)行的邏輯不之間的數(shù)字值的按位、 比較和None枚舉的常量,以確定是否已設置在數(shù)值中的任何位。

  7. 如果你創(chuàng)建而不是標志枚舉的值枚舉,它是仍必要創(chuàng)建None枚舉的常數(shù)。 原因是,默認情況下用于枚舉的內(nèi)存初始化為零的公共語言運行時。 因此,如果未定義其值為零的常量,枚舉將包含在創(chuàng)建時非法值。

  8. 如果你的應用程序需要表示明顯默認情況下,請考慮使用其值為零表示默認值的枚舉的常數(shù)。 如果沒有任何默認情況下,請考慮使用其值為零的枚舉的常數(shù)意味著不由任何其他枚舉常量表示這種情況。

  9. 未定義一個枚舉值,只是為了鏡像與枚舉本身的狀態(tài)。 例如,不定義僅用于枚舉的結束標記的枚舉的常數(shù)。 如果你需要確定在枚舉的最后一個值,請顯式檢查該值。 此外,你可以執(zhí)行范圍檢查第一個和最后一個枚舉常量,如果范圍內(nèi)的所有值都是有效。

  10. 不要指定保留供將來使用的枚舉的常數(shù)。

  11. 當你定義的方法或?qū)傩?,它采用作為值的枚舉的常數(shù)時,請考慮驗證值。 原因是,即使該數(shù)值不在枚舉中定義,你可以強制轉(zhuǎn)換為枚舉類型的數(shù)字值。

我們看到第二句告訴我們當加了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 我們可以看到實質(zhì)上就是做了二進制的或運算,將所有位值做了合并

當我們可以用做位運算的時候,就不僅僅是或,與,非,異或等操作都可以實現(xiàn)。

我們知道通過這樣可以把枚舉值合并 OrderTypeEnum result = OrderTypeEnum.Complete | OrderTypeEnum.Waiting | OrderTypeEnum.Paid ;

那么同理也可以來判斷這樣的集合中是否包含某個枚舉值:

result.HasFlag(OrderTypeEnum.Paid)  

枚舉通過添加Flags的特性使得它能夠擁有位運算的能力,更方便了我們再日常代碼中的使用。

以上是“C#中枚舉特性FlagAttribute的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


本文標題:C#中枚舉特性FlagAttribute的示例分析
本文路徑:http://fisionsoft.com.cn/article/psipse.html