激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#中枚舉的特性 FlagAttribute詳解

C#中枚舉的特性 FlagAttribute詳解

2022-02-20 14:12KenWang C#

說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據航班政策來返回哪些配送方式是否可用,根據這些是否可用來隱藏或者開啟界面的相關配送方式,不是非常明白,于是今天我們就來詳細探討下這個問題

寫在前面

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

FlagAttribute是什么?

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

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

?
1
2
3
4
5
6
7
8
9
10
public enum OrderTypeEnum
{
  Init,
 
  Complete,
 
  Waiting,
 
  Paid
}

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

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

?
1
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....)

那我們重新看一下重新定義之后的或操作會是什么結果呢?

?
1
2
3
4
5
6
7
8
9
10
11
[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 ;

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

?
1
result.HasFlag(OrderTypeEnum.Paid)  

寫在最后

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

參考資料:http://www.alanzucconi.com/2015/07/26/enum-flags-and-bitwise-operators/

原文鏈接:http://www.cnblogs.com/Wolfmanlq/p/8525090.html

延伸 · 閱讀

精彩推薦
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
主站蜘蛛池模板: 欧美wwwsss9999| 亚洲3atv精品一区二区三区 | 黄污视频在线看 | 国产午夜精品一区二区三区不卡 | 欧美一级一区二区三区 | 国产精品99久久久久久久女警 | 日韩黄在线| 国产99久久久久久免费看农村 | 一区二区免费 | 亚洲午夜久久久精品一区二区三区 | av成人在线免费观看 | 久久不射电影 | 一本色道久久综合亚洲精品图片 | 国产手机av在线 | 国产1区2| 欧美成人国产va精品日本一级 | 国产亚洲精久久久久久蜜臀 | 欧美精品久久久久久久久老牛影院 | 第四色成人网 | 一级免费视频 | 一本色道久久综合亚洲精品图片 | 成人不卡免费视频 | 久久成人视屏 | 亚洲精品aⅴ中文字幕乱码 中文字幕欧美在线 | 久久精品一区二区三区四区五区 | 一本到免费视频 | 国产精品.com | 国产免费小视频在线观看 | 日韩av影片在线观看 | 成年免费在线视频 | 美女扒开腿让男生桶爽网站 | 国产va在线观看 | 黄色网址在线视频 | 日韩视频一区二区三区在线观看 | 成年免费在线视频 | 亚洲一区二区三区高清 | 91色一区二区三区 | 国产一级毛片a | 伊人999 | 性爱在线免费视频 | 国产精品久久久久久久久久iiiii |