共用方式為


enum (C# 參考)

enum 關鍵字用來宣告列舉型別 (Enumeration),是由一組稱為列舉值清單的具名常數所構成的獨特型別。

通常最好是在命名空間內直接定義 enum,讓該命名空間中的所有類別都能同樣便利地存取它。 不過,enum 也可以透過巢狀方式置於個類別或結構 (Struct) 中。

根據預設,第一個列舉值的值是 0,而每一個接下來的列舉值會遞增 1。 例如,在下列列舉中,Sat是0,Sun是1,Mon是2,以此類推。

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

列舉程式可以使用初始設定式來覆寫預設值,如下列範例所示。

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

在這個列舉型別裡,項目的順序會強迫從 1 開始而不是 0。 不過,建議包括值為 0 的常數。 如需詳細資訊,請參閱 列舉類型 (C# 程式設計手冊)

每個列舉型別都有基礎型別,此基礎型別可以是除了 char 型別以外的任何整數型別。 列舉項目的預設基礎型別是 int。 若要宣告另一個整數類資料型別 (Integral Type) 的 enum,例如 byte,請在後面接著型別的識別項之後使用冒號,如下列範例中所示。

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

enum 的核准型別為 byte、sbyteshortushortintuintlongulong

可將基礎型別範圍內的任何值指派給 Days 型別的變數;這些值並不受限於具名常數。

enum E 的預設值是由運算式 (E)0 產生。

注意事項注意事項

列舉程式的名稱中不能包含空白字元。

目前型別會為每個列舉值指定配置的儲存區。 然而,將 enum 型別轉換成整數類資料型別需要明確轉換。 例如,下列陳述式會藉由使用轉型 (Cast) 將 enum 轉換成 int,而將列舉程式 Sun 指派給 int 型別的變數。

int x = (int)Days.Sun;

當您將 FlagsAttribute 套用至含有可與位元 OR 運算結合之項目的列舉時,這個屬性會在搭配某些工具使用時影響 enum 的行為。 當您使用 Console 類別方法、[運算式評估工具] 等工具時,便會注意到這些變更。 (請參閱第三個範例)。

健全的程式設計

如同任何常數,在編輯時期,enum 之個別值的所有參考都會轉換成數值常值。 這會造成如常數 (C# 程式設計手冊) 中所述的潛在版本控制問題。

不論是指派其他值給新版本的列舉,或是變更新版本之列舉成員的值,都可能造成相依的原始程式碼發生問題。 列舉值通常是在 switch 陳述式中使用。 如果在 enum 類型中加入其他項目,可能會意外選取 switch 陳述式的預設區段。

如果其他程式開發人員使用您的程式碼,您就應該提供方針,說明當任何 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 宣告的 FlagsAttribute 屬性及效果。

// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
    // The flag for SunRoof is 0001.
    SunRoof = 0x01,
    // The flag for Spoiler is 0010.
    Spoiler = 0x02,
    // The flag for FogLights is 0100.
    FogLights = 0x04,
    // The flag for TintedWindows is 1000.
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        // The bitwise OR of 0001 and 0100 is 0101.
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;

        // Because the Flags attribute is specified, Console.WriteLine displays 
        // the name of each enum element that corresponds to a flag that has 
        // the value 1 in variable options.
        Console.WriteLine(options);
        // The integer value of 0101 is 5.
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

註解

如果您移除Flags,範例會顯示下列值:

5

5

C# 語言規格

如需詳細資訊,請參閱<C# 語言規格>。語言規格是 C# 語法及用法的限定來源。

請參閱

參考

C# 關鍵字

整數類資料類型表 (C# 參考)

內建類型資料表 (C# 參考)

隱含數值轉換表 (C# 參考)

明確數值轉換表 (C# 參考)

概念

列舉類型 (C# 程式設計手冊)

其他資源

C# 參考