枚舉
枚舉是由程序員定義的類型,與類或結構一樣。
- 與結構一樣,枚舉是值類型:因此直接存儲它們的數據,而不是分開存儲成引用和數據。
- 枚舉只有一種類型的成員:命名的整數值常量。
下面的代碼展示了一個示例,聲明了一個名稱為TrafficLight的新枚舉類型,它含有3個成
貝。注意成員聲明列表是逗號分隔的列表,在枚舉聲明中沒有分號。
enum TrafficLight
{Green, //逗號分割,沒有分號Yellow, //逗號分割,沒有分號Red
}
每個枚舉類型都有一個底層整數類型,默認為int。
- 每個枚舉成員都被賦予一個底層類型的常量值。
- 在默認情況下,編譯器對第一個成員賦值為0,對每一個后續成員賦的值都比前一個成員多1。
例如,在TrafficLight類型中,編譯器把int值0、1和2分別賦值給成員Green、Yellow
和Red。在下面代碼的輸出中,把它們轉換成類型int,可以看到底層的成員值。圖12-1闡明了
它們在棧中的排列。
enum TrafficLight
{Green, //逗號分割,沒有分號Yellow, //逗號分割,沒有分號Red
}TrafficLight t1=TrafficLight.Green;
TrafficLight t2=TrafficLight.Yellow;
TrafficLight t3=TrafficLight.Red;Console.WriteLine($"{t1},\t{(int)t1}");
Console.WriteLine($"{t2},\t{(int)t2}");
Console.WriteLine($"{t3},\t{(int )t3}");
可以把枚舉值賦給枚舉類型變量。例如,下面的代碼展示了3個TrafficLight類型變量的聲
明。注意可以把成員字面量賦給變量,或從另一個相同類型的變量復制值。
class Program
{enum TrafficLight{Green, //逗號分割,沒有分號Yellow, //逗號分割,沒有分號Red}TrafficLight t1=TrafficLight.Green;TrafficLight t2=TrafficLight.Yellow;TrafficLight t3=TrafficLight.Red;Console.WriteLine(t1);Console.WriteLine(t2);Console.WriteLine(t3);
}
這段代碼產生以下輸出。注意,成員名被當作字符串打印。
設置底層類型和顯式值
可以把冒號和類型名放在枚舉名之后,這樣就可以使用int以外的整數類型。類型可以是任
何整數類型。所有成員常量都屬于枚舉的底層類型。
enum TrafficLight:ulong
{...
}
成員常量的值可以是底層類型的任何值。要顯式地設置一個成員的值,在枚舉聲明中的變量
名之后使用初始化表達式。盡管不能有重復的名稱,但可以有重復的值,如下所示。
enum TrafficLight
{Green=10,Yellow=15,Red=5
}
例如,圖12-2中的代碼展示了枚舉TrafficLight的兩個等價聲明。
- 左邊的代碼接受默認的類型和編號。
- 右邊的代碼顯式地將底層類型設置為int,并將成員設置為與默認值相應的值。