列舉型別讓開發者能為一組相關的常數命名,提升程式碼可讀性與維護性。本文涵蓋列舉的基本操作、數值轉換、Flags 屬性位元運算等進階技巧。
using System;
class MyClass
{
enum MyEnum { AA, BB, CC }; // 列舉定義不可在方法內部
static void Main()
{
MyEnum e = MyEnum.CC;
Console.WriteLine(e); // 輸出: CC (名稱)
Console.WriteLine((byte)e); // 輸出: 2 (byte 數值)
Console.WriteLine((int)e); // 輸出: 2 (int 數值)
Console.WriteLine(Convert.ToString(e)); // 輸出: CC
Console.ReadKey();
}
}
using System;
class MyClass
{
enum MyEnum { AA, BB, CC };
static void Main()
{
MyEnum e;
// 數值轉列舉
e = (MyEnum)1;
Console.WriteLine(e); // 輸出: BB
// 字串轉列舉
e = (MyEnum)Enum.Parse(typeof(MyEnum), "BB");
Console.WriteLine(e); // 輸出: BB
Console.ReadKey();
}
}
using System;
class MyClass
{
enum MyEnum { AA, BB, CC };
static void Main()
{
// 取得所有名稱
foreach (string s in Enum.GetNames(typeof(MyEnum)))
{
Console.WriteLine(s); // AA / BB / CC
}
// 取得所有數值
foreach (int n in Enum.GetValues(typeof(MyEnum)))
{
Console.WriteLine(n); // 0 / 1 / 2
}
Console.ReadKey();
}
}
列舉預設為 int、從 0 起始遞增,但可手動指定數值。
using System;
class MyClass
{
enum MyEnum { AA = 2, BB, CC = 7, DD, EE };
static void Main()
{
foreach (int i in Enum.GetValues(typeof(MyEnum)))
{
Console.WriteLine(i); // 2 / 3 / 7 / 8 / 9
}
Console.ReadKey();
}
}
可使用除 char 外的所有整數型別(byte、short、int、long 等)。
using System;
class MyClass
{
enum MyEnum : byte { AA, BB, CC, DD };
static void Main()
{
string[] names = Enum.GetNames(typeof(MyEnum));
foreach (string s in names) Console.WriteLine(s); // AA / BB / CC / DD
byte[] values = (byte[])Enum.GetValues(typeof(MyEnum));
foreach (byte n in values) Console.WriteLine(n); // 0 / 1 / 2 / 3
Console.ReadKey();
}
}
使用 2 的冪次方數值,配合 [Flags] 屬性,可進行位元組合運算。
using System;
class MyClass
{
enum MyEnum
{
AA = 0x0,
BB = 0x1,
CC = 0x2,
DD = 0x4,
EE = 0x8,
FF = 0x10,
GG = 0x20,
HH = 0x40
}
static void Main()
{
MyEnum es = MyEnum.CC | MyEnum.DD; // 位元 OR 運算
Console.WriteLine(es); // 輸出: 6 (或 CC, DD 若加 [Flags])
Console.ReadKey();
}
}
Enum.Parse 可將字串轉為列舉,需注意大小寫。Enum.GetNames / GetValues 適合動態列舉所有成員。BB 緊隨 AA=2 成為 3)。[Flags] 屬性,ToString() 會自動顯示組合名稱(如 "CC, DD")。