12 枚舉--C#

1.枚舉

枚舉是由程序員定義的類型挺狰,與結(jié)構(gòu)一樣身隐。

枚舉是值類型廷区,直接存儲(chǔ)它們的數(shù)據(jù),不是分開存儲(chǔ)成引用和數(shù)據(jù)贾铝。

枚舉只是一種類型的成員:命名的整數(shù)值常量隙轻。成員聲明之間逗號(hào)分隔。

例如:

enum TrafficLight

{

? ? ? ? Green,

? ? ? ? Yellow,

? ? ? ? Red

? ?}

使用關(guān)鍵字enum聲明垢揩,后加枚舉名稱 TrafficLight,枚舉值之間逗號(hào)分隔大脉,枚舉值使用大括號(hào)包裹。

每個(gè)枚舉值默認(rèn)為int.編譯器對(duì)第一個(gè)成員賦值為0水孩,后續(xù)每個(gè)成員賦值都比前一個(gè)多1.

測(cè)試:

Console.WriteLine($"{TrafficLight.Green}--{(int)TrafficLight.Green}");

輸出:Green--0


Console.WriteLine($"{TrafficLight.Yellow}--{(int)TrafficLight.Yellow}");

Yellow--1


可把枚舉值賦值給枚舉類型變量。

TrafficLight TL = TrafficLight.Green;

?TrafficLight TL2 = TL;

Console.WriteLine($"{TL2} --{(int)TL2}");

輸出:Green --0


設(shè)置底層類型和顯示值

類型可以是任何整數(shù)類型琐驴。盡管不能有重復(fù)名稱俘种,但是可以有重復(fù)值秤标。

//等效

? ? enum TrafficLight:int

? ? {

? ? ? ? Green =0,

? ? ? ? Yellow =1,

? ? ? ? Red=2

? ? }


也可以自定義值:

enum TrafficLight:int

? ? {

? ? ? ? Green =1,

? ? ? ? Yellow =3,

? ? ? ? Red=5

? ? }


給隱式成員編號(hào)

可顯式給任何成員變量賦值,如果不初始化成員常量宙刘,編譯器隱式給它賦初值苍姜。

enum Level

? ? {

? ? ? ? One =10,

? ? ? ? Two,

? ? ? ? Three=15,

? ? ? ? Four,

? ? ? ? Five=1

? ? }


測(cè)試:

Console.WriteLine($"{(int)Level.One} {(int)Level.Two} {(int)Level.Three} {(int)Level.Four} {(int)Level.Five}");

輸出:10 11 15 16 1

從輸出可以看出,可任意給枚舉成員變量指定整型值悬包,其后的變量值自動(dòng)加1衙猪,指定的值是可以跳變的,也可以默認(rèn)布近。


2.位標(biāo)志

單個(gè)字Single word的不同位表示一組開關(guān)標(biāo)志的緊湊方法垫释。成為標(biāo)志字 flag word.

一般步驟:

(1) 確定需要多少個(gè)標(biāo)志位,選擇一種有足夠多的位的無符號(hào)類型來保存它撑瞧。

(2) 確定每個(gè)位位置代表什么棵譬,并給它們一個(gè)名稱。

(3) 使用按位或OR 運(yùn)算符在持有該標(biāo)志位的字中設(shè)置適當(dāng)?shù)奈?/p>

(4) 使用按位與 AND運(yùn)算符或HasFlag方法檢查是否設(shè)置了特定位標(biāo)志


從C# 7.0開始预伺,可以使用二進(jìn)制表示法

使用Flags特性可帶來一些便利订咸。

[Flags]

? ? enum CardSettings:uint

? ? {

? ? ? ? SingleDeck? ? = 0x01,

? ? ? ? LargePictures = 0x02,

? ? ? ? FancyNumbers? = 0x04,

? ? ? ? Aniamation? ? = 0x08

? ? }

測(cè)試代碼:

CardSettings settings = CardSettings.SingleDeck | CardSettings.LargePictures;

?Console.WriteLine($"{settings} {(uint)settings}"); //輸出:3

使用Flags 屬性的標(biāo)志枚舉變量可以使用邏輯位運(yùn)算。


如果指定的標(biāo)志位有值返回true,否則返回false

Console.WriteLine(settings.HasFlag(CardSettings.SingleDeck));//true

Console.WriteLine(settings.HasFlag(CardSettings.Aniamation));//false


還可以檢測(cè)多個(gè)標(biāo)志位:

Console.WriteLine(settings.HasFlag(CardSettings.SingleDeck|CardSettings.FancyNumbers)); //False

Console.WriteLine(settings.HasFlag(CardSettings.SingleDeck | CardSettings.LargePictures)); //True


另一種判斷方法是使用按位與運(yùn)算酬诀,將該標(biāo)志字與標(biāo)志位相與脏嚷,然后與位標(biāo)志比較。

例如:檢查是否設(shè)置了FancyNumbers?

CardSettings settings = CardSettings.SingleDeck | CardSettings.LargePictures;

bool useFancyNumber = (settings & CardSettings.FancyNumbers) == CardSettings.FancyNumbers;

Console.WriteLine(useFancyNumber);

輸出: False


CardSettings settings = CardSettings.SingleDeck | CardSettings.FancyNumbers;

bool useFancyNumber = (settings & CardSettings.FancyNumbers) == CardSettings.FancyNumbers;

Console.WriteLine(useFancyNumber);

輸出:True



Flags特性

Flags特性不會(huì)改變結(jié)算結(jié)構(gòu)瞒御,卻提供了一些方便的特性父叙。

可以組成成位標(biāo)志。ToString( )方法提供了更多的格式化信息葵腹,

CardSettings settings = CardSettings.SingleDeck | CardSettings.FancyNumbers;

Console.WriteLine(settings.ToString());

輸出:

SingleDeck, FancyNumbers


settings = CardSettings.Aniamation;?

Console.WriteLine(settings.ToString());

輸出:

Aniamation


3.關(guān)于枚舉的更多內(nèi)容

枚舉只有單一的成員類型:聲明的成員常量

不能對(duì)成員使用修飾符

由于成員是靜態(tài)的高每,即使在沒有枚舉類的變量時(shí)也可以訪問它們。

枚舉類型.成員變? 訪問方式


其它一些枚舉類型的靜態(tài)方法:GetNames践宴,GetName,GetValues

Console.WriteLine($"{Enum.GetName(typeof(TrafficLight),1)}"); //Green

Console.WriteLine($"{Enum.GetName(typeof(TrafficLight), 3)}"); //Yellow


foreach (var n in Enum.GetNames(typeof(TrafficLight)))

{

? ? ? ? Console.WriteLine(n);

? }

輸出:

Green

Yellow

Red


foreach (var item in Enum.GetValues(typeof(TrafficLight)))

?{

? ? ? ? ? ?Console.WriteLine((int)item);

? }

輸出:

1

3

5

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲸匿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阻肩,更是在濱河造成了極大的恐慌带欢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烤惊,死亡現(xiàn)場(chǎng)離奇詭異乔煞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柒室,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門渡贾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雄右,你說我怎么就攤上這事空骚》慕玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵囤屹,是天一觀的道長(zhǎng)熬甚。 經(jīng)常有香客問我,道長(zhǎng)肋坚,這世上最難降的妖魔是什么乡括? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮智厌,結(jié)果婚禮上诲泌,老公的妹妹穿的比我還像新娘。我一直安慰自己峦剔,他們只是感情好档礁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吝沫,像睡著了一般呻澜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惨险,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天羹幸,我揣著相機(jī)與錄音,去河邊找鬼辫愉。 笑死栅受,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恭朗。 我是一名探鬼主播屏镊,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼痰腮!你這毒婦竟也來了而芥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤膀值,失蹤者是張志新(化名)和其女友劉穎棍丐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沧踏,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歌逢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翘狱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秘案。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出踏烙,到底是詐尸還是另有隱情师骗,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布讨惩,位于F島的核電站,受9級(jí)特大地震影響寒屯,放射性物質(zhì)發(fā)生泄漏荐捻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一寡夹、第九天 我趴在偏房一處隱蔽的房頂上張望处面。 院中可真熱鬧,春花似錦菩掏、人聲如沸魂角。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽野揪。三九已至,卻和暖如春瞧栗,著一層夾襖步出監(jiān)牢的瞬間斯稳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工迹恐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挣惰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓殴边,卻偏偏與公主長(zhǎng)得像憎茂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锤岸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這篇文章主要介紹了理解C#中的枚舉,本文講解了枚舉的優(yōu)點(diǎn)竖幔、枚舉說明、枚舉的類型能耻、枚舉的使用建議等內(nèi)容,需要的朋友可...
    天lc吶閱讀 3,811評(píng)論 0 1
  • 1赏枚、C#中 property 與 attribute的區(qū)別,他們各有什么用處晓猛,這種機(jī)制的好處在哪里饿幅? proper...
    胤醚貔貅閱讀 4,977評(píng)論 0 7
  • 一、枚舉類型的概念 枚舉類型聲明為一組相關(guān)的符號(hào)常數(shù)定義了一個(gè)類型名稱戒职。枚舉用于"多項(xiàng)選擇"場(chǎng)合栗恩,就是程序運(yùn)行時(shí)從...
    小明yz閱讀 1,366評(píng)論 1 2
  • 早上在面館吃面,女的擰開冰紅茶喝了一口洪燥,看了一下瓶蓋說:老公再來一瓶是什么磕秤?她老公說我也不知道乳乌,于是女的就把瓶蓋往...
    JJJ___閱讀 743評(píng)論 0 0
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)市咆,但是人生放棄了冒險(xiǎn)汉操,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,052評(píng)論 0 4