什麼是列舉
- 就是「一一列舉」的意思
- 在計算機領域,被稱作為
enumerate,表示一個常數的集合 - 一周7天:Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
在 C# 中,我們通常使用關鍵詞 enum來聲明一個列舉類型。
比如說,我們現在來聲明一周 Weekday 的類型:
1
2
3
4
5
6
7
8
9
10
enum Weekday
{
Monday, //0
Tuesday, //1
Wednesday,//2
Thursday,//3
Friday,//4
Saturday,
Sunday
}
注意,enum 所聲明的集合中,預定義的數據都是不可改變的,所以一定是常量的集合。
列舉類型中每一個元素在底層實現上,會使用它的這個位置信息作為真實的數據保存在內存中,所以從原理上來說,列舉類型中每一個列舉元素,它的類型是常量整數類型,所以我們可以看到Monday = 0、 Tuesday = 1、 Wednesday = 2,如此類推。
enum 類型轉換
我們可以在main方法中,隨便通過 Weekday創建一個日期:
1
Weekday friday = Weekday.Friday;//friday的數據是4
把鼠標移到 Friday上,我們可以看到這裡提示我們 Friday的數據就是整數4,這就是Friday在 Weekday列舉類型中的位置而已。
如果我們直接在Console.WriteLine(friday);輸出,我們將會在命令行中以字串的形式看到列舉 Friday元素的名稱
1
Console.WriteLine(friday); //輸出: Friday
我們也可以在命令行中輸出 friday 內存中真實的數據,也就整數4
1
Console.WriteLine((int)friday); //輸出: 4
而正是因為在底層數據上為整數,所以我們可以通過類型轉換的方式,把一個整數轉化為列舉數據,例如,我們可以把整數4轉化為列舉集合中的周五Friday。
聲明一個變量 var friday2 = 4,使用列舉類型 Weekday進行類型轉化,那麼這個時候把鼠標放在 friday2上面,可以看到它類型已經變成 Weekday。
1
var friday2 = (Weekday)4; //把鼠標放在 `friday2`上面,可以看到它類型已經變成 `Weekday`
給 enum 元素賦值
我們將 Friday設為 5,那麼周五的數據就會從 5 開始,重新計算位置信息。
現在周六變成 6,周日變成 7。
1
2
3
4
5
6
7
8
9
10
enum Weekday
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday = 5, //原本默認4,改成5
Saturday, //重新計算位置信息,變成6
Sunday //重新計算位置信息,變成7
}
所以使用等號=給列舉成員賦值的時機非常重要。
C# 會根據上一次賦值的位置來通過累加計算,得到接下來每一個列舉成員的具體數據。
所以對於Weekday來說,我們周一也可以從整數1 開始進行重新賦值。
周一對應整數1,周二對應整數2,周三對應整數4,以此類推,那麼樣的賦值結果將會更加自然
1
2
3
4
5
6
7
8
9
10
enum Weekday
{
Monday = 1,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
不過如果我們在賦值過程中不小心出了錯,例如,我們不小心把Friday賦值3,那麼這個時候列舉類型一定會提出警告,它會告訴我們:常數3已經被佔用了,希望我們可以給它換一個數字。
enum 搭配 switch 使用
一般來說,列舉類型非常適合與 switch 語句配合使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Weekday day = Weekday.Monday;
switch (day)
{
case Weekday.Monday:
case Weekday.Tuesday:
case Weekday.Wednesday:
case Weekday.Thursday:
case Weekday.Friday:
Console.WriteLine("今天要上班");
break;
case Weekday.Saturday:
case Weekday.Sunday:
Console.WriteLine("家裡蹲");
break;
}