Home [C# 筆記] 枚舉(列舉) Enum
Post
Cancel

[C# 筆記] 枚舉(列舉) Enum

什麼是列舉

  • 就是「一一列舉」的意思
  • 在計算機領域,被稱作為 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 = 0Tuesday = 1Wednesday = 2,如此類推。

enum 類型轉換

我們可以在main方法中,隨便通過 Weekday創建一個日期:

1
Weekday friday = Weekday.Friday;//friday的數據是4

把鼠標移到 Friday上,我們可以看到這裡提示我們 Friday的數據就是整數4,這就是FridayWeekday列舉類型中的位置而已。

如果我們直接在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;
}

https://www.bilibili.com/video/BV1Ss4y1B7zE?p=48

This post is licensed under CC BY 4.0 by the author.