共用方式為


enum 陳述式

更新:2007 年 11 月

宣告列舉資料型別的名稱和列舉型別的成員名稱。

[modifiers] enum enumName [ : typeAnnotation]{
   enumValue1 [ = initializer1]
   [,enumValue2 [ = initializer2]
   [, ... [,enumValueN [ = initializerN ] ]]]
}

引數

  • 修飾詞
    選擇項。修飾詞,控制列舉型別的可視性和行為。

  • enumName
    必要項。列舉型別的名稱。

  • typeAnnotation
    選擇項。列舉型別的基礎資料型別。必須是整數類資料型別。預設為 int。

  • enumValue1, enumValue2, ..., enumValueN
    選擇項。列舉型別成員。

  • initializer1, initializer2, ..., initializerN
    選擇項。常數運算式,會覆寫列舉型別成員的預設數值。

備註

enum 宣告將新的列舉資料型別引入程式。enum 宣告只能出現在類別宣告可以出現的內容中,也就是全域範圍、套件範圍或類別範圍,但是不能出現在函式或方法中。

您可以將列舉型別的基礎型別宣告為任何整數類資料型別 (int、shortlongbyte、uint、ushort、ulong 或 sbyte)。列舉成員隱含強制轉換成基礎資料型別或從基礎資料型強制轉換,允許數值資料可以直接設定給 enum 型別變數。根據預設,列舉型別的基礎資料型別是 int。

每個列舉型別成員都有一個名稱和選擇性 (Optional) 初始設定式。初始設定式必須是編譯時期常數運算式,此運算式與指定列舉型別有相同型別,或是可以轉換成此型別。第一個列舉型別成員的值是零或初始設定式的值 (如果有提供)。接下來的每個列舉型別成員的值會比先前的成員或初始設定式的值 (如果有提供) 多一。

存取 enum 值的方式類似於存取靜態類別成員。成員的名稱必須以列舉型別的名稱來限定,例如 Color.Red。將值指派給 enum 型別的變數時,要使用下列其中一項:完整正確的名稱 (例如 Color.Red)、名稱的字串 (String) 表示 (例如 "Red") 或數值。

如果 enum 是設定給在編譯時期就已知的字串,編譯器會執行需要的轉換。例如,會以 Color.Red 取代 "Red"。如果字串在編譯時期為未知,則會在執行階段進行轉換。如果字串不是列舉型別的有效成員,轉換會失敗。因為轉換會耗費時間而且可能會產生執行階段錯誤,因此請避免將 enum 指定給變數字串。

列舉型別的變數可以儲存宣告值的範圍外部的值。這項功能的其中一種用法是允許使用成員的結合來當成位元旗標,如下列範例中所示。將 enum 變數轉換成字串會產生成員名稱的字串表示。

範例 1

下列範例顯示列舉型別的行為。它會宣告一個名為 CarType 的簡單列舉型別,具有成員 Honda、Toyota 和 Nissan。

enum CarType {
   Honda,    // Value of zero, since it is first.
   Toyota,   // Value of 1, the successor of zero.
   Nissan    // Value of 2.
}

// Declare a variable of type CarType, and give it the value Honda.
var myCar : CarType = CarType.Honda;
print(int(myCar) + ": " + myCar);

myCar = "Nissan"; // Change the value to "Nissan".
print(int(myCar) + ": " + myCar);

myCar = 1; // 1 is the value of the Toyota member.
print(int(myCar) + ": " + myCar);

本程式碼的輸出為:

0: Honda
2: Nissan
1: Toyota

範例 2

下列範例說明如何使用列舉型別來儲存位元旗標,同時也說明該 enum 變數必須能夠儲存沒有明確列於成員清單的值。它定義一個 FormatFlags 列舉型別,用來修改 Format 函式的行為。

// Explicitly set the type to byte, as there are only a few flags.
enum FormatFlags : byte {
   // Can't use the default values, since we need explicit bits
   ToUpperCase = 1,   // Should not combine ToUpper and ToLower.
   ToLowerCase = 2,
   TrimLeft    = 4,   // Trim leading spaces.
   TrimRight   = 8,   // Trim trailing spaces.
   UriEncode   = 16   // Encode string as a URI.
}

function Format(s : String, flags : FormatFlags) : String {
   var ret : String = s;
   if(flags & FormatFlags.ToUpperCase) ret = ret.toUpperCase();
   if(flags & FormatFlags.ToLowerCase) ret = ret.toLowerCase();
   if(flags & FormatFlags.TrimLeft)    ret = ret.replace(/^\s+/g, "");
   if(flags & FormatFlags.TrimRight)   ret = ret.replace(/\s+$/g, "");
   if(flags & FormatFlags.UriEncode)   ret = encodeURI(ret);
   return ret;
}

// Combine two enumeration values and store in a FormatFlags variable.
var trim : FormatFlags = FormatFlags.TrimLeft | FormatFlags.TrimRight;
// Combine two enumeration values and store in a byte variable.
var lowerURI : byte = FormatFlags.UriEncode | FormatFlags.ToLowerCase;

var str : String = "  hello, WORLD  ";

print(trim + ": " + Format(str, trim));
print(FormatFlags.ToUpperCase + ": " + Format(str, FormatFlags.ToUpperCase));
print(lowerURI + ": " + Format(str, lowerURI));

本程式碼的輸出為:

12: hello, WORLD
ToUpperCase:   HELLO, WORLD  
18: %20%20hello,%20world%20%20

需求

.NET 版本

請參閱

概念

型別轉換

型別附註

其他資源

修飾詞