enum (C# 參考)
更新:2007 年 11 月
enum 關鍵字用來宣告列舉型別 (Enumeration),是由一組稱為列舉值清單的具名常數所構成的獨特型別。
通常最好是在命名空間內直接定義 enum,讓該命名空間中的所有類別都能同樣便利地存取它。不過,enum 也可以透過巢狀方式置於個類別或結構 (Struct) 中。
根據預設,第一個列舉值的值是 0,而每一個接下來的列舉值會遞增 1。例如:
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
在這個列舉型別裡,Sat 是 0,Sun 是 1,Mon 是 2,依此列舉。列舉值可以有初始設定式來覆寫預設值。例如:
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
在這個列舉型別裡,項目的順序會強迫從 1 開始而不是 0。不過,強烈建議 enum 要包含值為 0 的常數。如需詳細資訊,請參閱列舉型別 (C# 程式設計手冊)。
每個列舉型別都有基礎型別,此基礎型別可以是除了 char 型別以外的任何整數型別。列舉項目的預設基礎型別是 int。若要宣告另一個整數類資料型別 (Integral Type) 的 enum,例如 byte,請在後面接著型別的識別項之後使用冒號:
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
enum 的核准型別為 byte、sbyte、short、ushort、int、uint、long 或 ulong。
可將基礎型別範圍內的任何值指派給 Days 型別的變數;這些值並不受限於具名常數。
enum E 的預設值是由運算式 (E)0 產生。
注意事項: |
---|
列舉值的名稱中可能不包含空格。 |
目前型別會為每個列舉值指定配置的儲存區。然而,將 enum 型別轉換成整數類資料型別需要明確轉換。例如,下列陳述式會藉由使用轉型 (Cast) 將 enum 轉換成 int,而將列舉值 Sun 指派給 int 型別的變數:
int x = (int)Days.Sun;
套用 System.FlagsAttribute 的列舉型別如果包含某些結合了位元 OR 運算的項目,您會注意到在使用某些工具時,此屬性 (Attribute) 會影響 enum 的行為。當您使用 Console 類別方法、[運算式評估工具] 等工具時,便會注意到這些變更 (請參閱範例 3)。
穩固程式設計
如同任何常數,在編輯時期,enum 之個別值的所有參考都會轉換成數值常值。這會造成如常數 (C# 程式設計手冊) 中所述的潛在版本控制問題。
不論是指派其他值給新版本的列舉,或是變更新版本之列舉成員的值,都可能造成相依的原始程式碼發生問題。列舉值通常是在 switch 陳述式中使用。如果 enum 型別中已經加入了其他項目,則預設值的測試將會傳回非預期的 true。
如果其他程式開發人員將使用您的程式碼,您就應該提供方針,說明當任何 enum 型別中加入新項目時,他們的程式碼應該要如何回應。
範例
在這個範例裡,宣告了一個 Days 列舉型別。兩個列舉值會明確轉換成整數,然後指派給整數變數。
public class EnumTest
{
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
static void Main()
{
int x = (int)Days.Sun;
int y = (int)Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}
/* Output:
Sun = 0
Fri = 5
*/
在這個範例中,使用基底型別選項來宣告 enum,其成員為 long 型別。請注意,即使列舉型別的基礎型別是 long,列舉型別成員仍應利用轉型明確轉換成 long 型別。
public class EnumTest2
{
enum Range : long { Max = 2147483648L, Min = 255L };
static void Main()
{
long x = (long)Range.Max;
long y = (long)Range.Min;
Console.WriteLine("Max = {0}", x);
Console.WriteLine("Min = {0}", y);
}
}
/* Output:
Max = 2147483648
Min = 255
*/
下列程式碼範例將示範如何使用 enum 宣告的 System.FlagsAttribute 屬性及效果。
[Flags]
public enum CarOptions
{
SunRoof = 0x01,
Spoiler = 0x02,
FogLights = 0x04,
TintedWindows = 0x08,
}
class FlagTest
{
static void Main()
{
CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
Console.WriteLine(options);
Console.WriteLine((int)options);
}
}
/* Output:
SunRoof, FogLights
5
*/
註解
請注意,如果移除了 FlagsAttribute,則範例將輸出以下內容:
5
5
C# 語言規格
如需詳細資料,請參閱 C# 語言規格中的下列章節:
1.10 列舉
6.2.2 明確列舉轉換
14 列舉