最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中枚舉的特性 FlagAttribute詳解

 更新時間:2018年03月08日 08:52:12   作者:KenWang  
說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據(jù)航班政策來返回哪些配送方式是否可用,根據(jù)這些是否可用來隱藏或者開啟界面的相關(guān)配送方式,不是非常明白,于是今天我們就來詳細(xì)探討下這個問題

寫在前面

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

FlagAttribute是什么?

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

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

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

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

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

OrderTypeEnum result = OrderTypeEnum.Waiting | OrderTypeEnum.Paid;

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

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

我們看到第二句告訴我們當(dāng)加了Flags的特性之后默認(rèn)的枚舉值就會以2的冪一次遞增,比如 20,21,22,23(1,2,4,8....)

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

[Flags]
 public enum OrderTypeEnum
 {
   Init,
 
   Complete,
 
   Waiting,
 
   Paid
 }  

此時我們再來看:OrderTypeEnum result = OrderTypeEnum.Complete | OrderTypeEnum.Waiting | OrderTypeEnum.Paid ;

0010 | 0100 | 1000 = 1110 我們可以看到實質(zhì)上就是做了二進(jìn)制的或運(yùn)算,將所有位值做了合并

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

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

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

result.HasFlag(OrderTypeEnum.Paid)  

寫在最后

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

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

相關(guān)文章

  • 分析C# Dictionary的實現(xiàn)原理

    分析C# Dictionary的實現(xiàn)原理

    對于C#中的Dictionary類相信大家都不陌生,這是一個Collection(集合)類型,可以通過Key/Value(鍵值對的形式來存放數(shù)據(jù);該類最大的優(yōu)點(diǎn)就是它查找元素的時間復(fù)雜度接近O(1)。那么什么樣的設(shè)計能使得Dictionary類實現(xiàn)O(1)的時間復(fù)雜度呢
    2021-06-06
  • C#中函數(shù)的創(chuàng)建和閉包的理解

    C#中函數(shù)的創(chuàng)建和閉包的理解

    這篇文章主要介紹了C#中函數(shù)的創(chuàng)建和閉包的理解,本文講解了動態(tài)創(chuàng)建函數(shù)、匿名函數(shù)不足之處、理解c#中的閉包、閉包的優(yōu)點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 使用C#代碼在Word文檔中插入列表的操作方法

    使用C#代碼在Word文檔中插入列表的操作方法

    列表在 Word 文檔中用于概述、排列和強(qiáng)調(diào)文本,使用戶能夠輕松掃描和理解一系列項目,在本文中,您將學(xué)習(xí)如何使用 Spire.Doc for .NET 在 C# 和 VB.NET 中將這些類型的列表插入到 Word 文檔中,需要的朋友可以參考下
    2025-11-11
  • C#反射調(diào)用拓展類方法實例代碼

    C#反射調(diào)用拓展類方法實例代碼

    這篇文章主要給大家介紹了關(guān)于C#反射調(diào)用拓展類方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • C#實現(xiàn)帶進(jìn)度條的ListView

    C#實現(xiàn)帶進(jìn)度條的ListView

    這篇文章主要介紹了C#實現(xiàn)帶進(jìn)度條的ListView 的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 詳解C#中使用對象或集合的初始值設(shè)定項初始化的操作

    詳解C#中使用對象或集合的初始值設(shè)定項初始化的操作

    這篇文章主要介紹了詳解C#中使用對象或集合的初始值設(shè)定項初始化的操作,文中分別講了對對象和字典的初始化,需要的朋友可以參考下
    2016-01-01
  • C#微信開發(fā)之微信公眾號標(biāo)簽管理功能

    C#微信開發(fā)之微信公眾號標(biāo)簽管理功能

    這篇文章主要介紹了C#微信開發(fā)之微信公眾號標(biāo)簽管理功能 的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • c#自定義Attribute獲取接口實現(xiàn)示例代碼

    c#自定義Attribute獲取接口實現(xiàn)示例代碼

    這篇文章主要給大家介紹了關(guān)于c#自定義Attribute獲取接口實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • WPF實現(xiàn)文字粒子閃爍動畫效果

    WPF實現(xiàn)文字粒子閃爍動畫效果

    這篇文章主要為大家詳細(xì)介紹了WPF實現(xiàn)文字粒子閃爍動畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C#中的預(yù)處理器指令詳解

    C#中的預(yù)處理器指令詳解

    這篇文章主要介紹了C#中的預(yù)處理器指令詳解,本文講解了#define 和 #undef、#if、#elif、#else和#endif、#warning和#error、#region和#endregion、#line、#pragma等預(yù)處理器指令,需要的朋友可以參考下
    2015-01-01

最新評論

于田县| 美姑县| 大余县| 深水埗区| 赤峰市| 桂平市| 安新县| 廊坊市| 上栗县| 定日县| 五家渠市| 宣城市| 定边县| 城步| 灵台县| 汽车| 芒康县| 台北县| 靖州| 土默特左旗| 大邑县| 龙海市| 泰顺县| 利津县| 台北县| 南阳市| 清苑县| 壤塘县| 涟源市| 鹤山市| SHOW| 东乡族自治县| 康乐县| 桑植县| 古交市| 龙川县| 灵武市| 沁水县| 东平县| 九龙县| 泾川县|