摘要:C#系列菜單-『列舉(Enum)』
包大人: 有錢人總是有多重身份,討厭~!。
有為:可是十三叔你也有多重身份,貪官、鼠輩、九品小官,但還是一樣沒錢啊~
包大人: 對啊~我也不要知道為什麼啊~!?
~本文主題~
『列舉(enum)是啥呢??』
本文主要介紹列舉(enum)的是什麼與基本用法。
~正文開始~
『列舉(enum)是啥呢??』
列舉(enum)是什麼呢?
enum是針對某資料片段只允許特定值的『資料型別(Type)』。
好文言文,我們建個範例比較容易了解。
在此範例定義名為Suits的enum。定義所允許的花色。
(這只是英文翻譯一下)
Spades = 黑桃
Clubs = 梅花
Diamonds = 方塊
Hearts = 紅心
public enum Suits
{
Spades = 0,
Clubs = 1,
Diamonds = 2,
Hearts = 3,
}
輸出。
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine(Suits .Clubs);
Console.WriteLine((int )Suits.Clubs);
}
執行結果
Enum不使用預設Int
有時候,預設的Int型別不適合我們的需求,例如
有個數字非常大,Int就沒辦法使用,我們需要使用
long型別,因此我們可以改成下列程式碼。
public enum Suits : long //在這修改預設的型別
{
Spades = 0,
Clubs = 200000000000005,
Diamonds = 2,
Hearts = 3,
}
執行結果
這邊注意一下Enum所允許的型別
Enum型別(它本來就是型別的一種)
我們建立一個範例,主要就是隨機抽卡,
然後顯示所抽到的花色與值的小小程式。
首先我們建立兩個Enum
Suits : 建立花色的列舉並給每個花色所代表的數字。
Values : 建立值的列舉, 並給每個值所代表的數字。
public enum Suits
{
Spades = 0,
Clubs = 1,
Diamonds = 2,
Hearts = 3,
}
public enum Values
{
Ace = 1,
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7,
Eight = 8,
Night = 9,
Ten = 10,
Jack = 11,
Queen = 12,
King = 13,
}
再建立個樸克牌的類別
兩個欄位
suit : 存放抽到的花色,型別為Suits列舉。
value : 存放抽到的值 ,型別為Values列舉。
(註:別忘了我們上章所說的封裝性概念,不該出現的就不要出現)
一個屬性
Name : 回傳抽到的值與花色的名稱
public class Card
{
//建立Suits 型別 名為Suit的欄位。
//存放抽到的花色。
private Suits suit;
//建立Values 型別 名為Value的欄位
private Values value;
//建構子,實體化時給予初使值
//物件實體化時,將押到的花色與值代入至suit與value欄位。
public Card(Suits suit, Values value)
{
this.suit = suit;
this.value = value;
}
//建立唯讀Name屬性。
//回傳所押到的花色與值。
public string Name
{
get
{
return suit.ToString() + " Of " + value.ToString();
}
}
}
執行抽牌
private void button1_Click(object sender, EventArgs e)
{
//實體化Random類別為random物件。
Random random = new Random();
//實體化Card類別,產生card物件。
Card card = new Card((Suits)random.Next(4), ( Values)random.Next(1, 14));
MessageBox.Show(card.Name);
}
其中Random為產生亂數之類別。我們需要使用到Random裡的Next方法,
來產生範圍內的亂數,例如 random.Next(1,14)就會產生1~14的隨機數字。
//
// 摘要:
// 傳回指定範圍內的亂數。
//
// 參數:
// minValue:
// 傳回亂數的內含下限 (Inclusive Lower Bound)。
//
// maxValue:
// 傳回亂數的獨佔上限。 maxValue 必須大於或等於 minValue。
//
// 傳回:
// 32 位元帶正負號的整數大於或等於 minValue,並且小於 maxValue;也就是說,傳回值的範圍包含 minValue 但不包含 maxValue。
// 如果 minValue 等於 maxValue,會傳回 minValue。
//
// 例外狀況:
// System.ArgumentOutOfRangeException:
// minValue 大於 maxValue。
public virtual int Next( int minValue, int maxValue);
最後執行結果
注意
在上述的範例中,我們來看看一下比較特殊的程式碼,
下列行程式碼。
Card card = new Card((Suits)random.Next(4), ( Values)random.Next(1, 14));
我們來看看 (Suits)random.Next(4) ,這行是會產生什麼。
我們增加一行 Console .WriteLine(this .suit);
public Card( Suits suit, Values value)
{
this.suit = suit;
Console.WriteLine(this .suit);
this.value = value;
// Console.WriteLine(this.value);
}
執行結果,可以知道運用Random他會產生數字,但他在前面加(Suits)
就會自動將他轉換成對應的英文字了。