列舉 enum
列舉enum是一種有效率的方式給一組變數各別的整數,並且可以不必一一指定。
舉一個最簡單的例子,如果我要設定周日到周六這七天,周日為0,周一為1這樣以此類推,如果不用列舉,我可能要設一個struct,然後一筆一筆的設定,這樣的方式很不方便,若是我使用列舉,情況就不一樣了。
使用列舉我只需要像下面這樣子宣告:
enum Week { Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}
這樣子我就宣告好了,我們可以測試一下。
Console.WriteLine(Week.Sunday + "," + (int)Week.Sunday);
Console.WriteLine(Week.Monday + "," + (int)Week.Monday);
Console.WriteLine(Week.Tuesday + "," + (int)Week.Tuesday);
輸出結果會是下面這樣:
Sunday,0
Monday,1
Tuesday,2
有一個地方要注意一下,可以看到在這裡如果是Week.Sunday會印出文字,而 (int)Week.Sunday會印出數值,enum會給每個變數一個數值,Week.Sunday會是變數名稱,而當你想要得到這個變數名稱的數值就要用(int)來做轉型。
從輸出結果就可以看到,完全就不需要指定數值,從周日到周六就照順序0~6設定好了。如果要指定數值,可以只有指定第一個,後面的就會自動一個個照順序加1,如下面的例子
enum Animals { Monkey=1,Elephant,Mouse }
static void Main(string[] args)
{
Console.WriteLine(Animals.Monkey + "," + (int)Animals.Monkey);
Console.WriteLine(Animals.Elephant + "," + (int)Animals.Elephant);
Console.WriteLine(Animals.Mouse + "," + (int)Animals.Mouse);
}
輸出結果會是下面這樣:
Monkey,1
Elephant,2
Mouse,3
當然,也可以每一個都自己設定數值,舉例如下:
enum Person { Mary=1,Joe=5,Danny=2 }
static void Main(string[] args)
{
Console.WriteLine(Animals.Monkey + "," + (int)Animals.Monkey);
Console.WriteLine(Animals.Elephant + "," + (int)Animals.Elephant);
Console.WriteLine(Animals.Mouse + "," + (int)Animals.Mouse);
}
輸出結果會是下面這樣:
Mary,1
Joe,5
Danny,2
可以看到每一個項目數值都是照程式設定的。
Enum裡面的數值是可以相加的,例如Person.Mary + Person.Joe,我們可以來試一下結果如何。
Console.WriteLine(Person.Mary + "+" + Person.Joe + (int)Person.Mary + (int)Person.Joe);
輸出結果:
Mary+Joe,15
這跟我們原本想要的不一樣,本來以為1+5=6,結果出來變成15,這是因為這樣子寫的話是(int)Person.Mary和(int)Person.Joe的兩個數字以字串做相加,而不是數字相加,就變成15而不是6。
如果要得到正確的結果,寫法如下:
Console.WriteLine(Person.Mary + "+" + Person.Joe + ((int)Person.Mary + (int)Person.Joe));
輸出結果:
Mary+Joe,6
用()包起來,出來的結果就會是兩個數字相加,得到6。
本範例的完整程式碼如下:
class Program { enum Week { Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday} enum Animals { Monkey=1,Elephant,Mouse } enum Person { Mary=1,Joe=5,Danny=2 }
static void Main(string[] args) {
Console.WriteLine(Week.Sunday + ","+(int)Week.Sunday); Console.WriteLine(Week.Monday + "," + (int)Week.Monday); Console.WriteLine(Week.Tuesday + "," + (int)Week.Tuesday); Console.WriteLine("------------------------------------------"); Console.WriteLine(Animals.Monkey+","+(int)Animals.Monkey); Console.WriteLine(Animals.Elephant + "," + (int)Animals.Elephant); Console.WriteLine(Animals.Mouse + "," + (int)Animals.Mouse); Console.WriteLine("------------------------------------------"); Console.WriteLine(Person.Mary + "," + (int)Person.Mary); Console.WriteLine(Person.Joe + "," + (int)Person.Joe); Console.WriteLine(Person.Danny + "," + (int)Person.Danny); Console.WriteLine(Person.Mary + "+" + Person.Joe + "錯誤寫法," + (int)Person.Mary + (int)Person.Joe); Console.WriteLine(Person.Mary + "+" + Person.Joe + "正確寫法," + ((int)Person.Mary + (int)Person.Joe));
Console.ReadLine(); } |
輸出結果
Sunday,0 Monday,1 Tuesday,2 ------------------------------------------ Monkey,1 Elephant,2 Mouse,3 ------------------------------------------ Mary,1 Joe,5 Danny,2 Mary+Joe錯誤寫法,15 Mary+Joe正確寫法,6 |