C# 程序員參考
enum(C# 參考)
enum 關鍵字用於聲明枚舉,即一種由一組稱爲枚舉數列表的命名常數組成的獨特類型。每種枚舉類型都有基礎類型,該類型可以是除 char 以外的任何整型。枚舉元素的默認基礎類型爲 int。默認情況下,第一個枚舉數的值爲 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 開始。
可以給 Days 類型的變量賦以基礎類型範圍內的任何值,所賦的值不限於已命名的常數。
enum E 的默認值爲表達式 (E)0 產生的值。
注意
枚舉數的名稱中不能包含空白。
基礎類型指定爲每個枚舉數分配的存儲大小。但是,從 enum 類型到整型的轉換需要用顯式類型轉換來完成。例如,下面的語句通過使用強制轉換從 enum 轉換爲 int,將枚舉數 Sun 賦給 int 類型的變量:
int x = (int)Days.Sun;
將 System.FlagsAttribute 應用於某個枚舉時,如果該枚舉包含一些使用按位“或”運算組合的元素,這時您會注意到該屬性在用於某些工具時會影響 enum 的行爲。當使用諸如 Console 類方法、表達式計算器這樣的工具時,可以注意到這些變化。(請參見示例 3)。
可靠編程
如果給新版本的枚舉賦其他值,或者更改新版本中枚舉成員的值,可能引起相關源代碼的問題。情況通常是:switch 語句中使用了 enum 值,如果已將其他元素添加到 enum 類型中,那麼默認值的測試可能意外地返回 true。
如果其他開發人員將使用您的代碼,您需要提供相關說明,告訴開發人員將新元素添加到任何 enum 類型時,他們的代碼應該如何響應。
示例
在此例中,聲明瞭一個枚舉 Days。兩個枚舉數被顯式轉換爲整數並賦給整型變量。
// keyword_enum.cs
// enum initialization:
using System;
public class EnumTest
{
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
static void Main()
{
int x = (int)Days.Sun;
int y = (int)Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}
輸出
Sun = 2
Fri = 7
在此例中,使用了基類選項來聲明成員類型是 long 的 enum。注意,即使枚舉的基礎類型是 long,枚舉成員仍然必須使用強制轉換顯式轉換爲 long 類型。
// keyword_enum2.cs
// Using long enumerators
using System;
public class EnumTest
{
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);
}
}
輸出
Max = 2147483648
Min = 255
下面的代碼示例闡釋 enum 聲明上的 System.FlagsAttribute 屬性的使用和效果。
// enumFlags.cs
// Using the FlagsAttribute on enumerations.
using System;
[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);
}
}
輸出
SunRoof, FogLights
5
註釋
注意:如果從 Sat=1 中移除初始值設定項,結果將是:
複製代碼
Sun = 1
Fri = 6
註釋
請注意,如果移除 FlagsAttribute,此示例的輸出爲:
5
5