enum
Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum
Months :
byte
{ Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
默認情況下,枚舉中每個元素的基礎類型是 int。可以使用冒號指定另一種整數值類型,如前面的示例所示。可以通過轉換驗證基礎數值與基礎類型,如下例所示。
? 1 2 3 4 5 6 7Days today = Days.Monday;
int
dayNumber =(
int
)today;
Console.WriteLine(
"{0} is day number #{1}."
, today, dayNumber);
Months thisMonth = Months.Dec;
byte
monthNumber = (
byte
)thisMonth;
Console.WriteLine(
"{0} is month number #{1}."
, thisMonth, monthNumber);
輸出:
? 1 2Monday is day number #1.
Dec is month number #11.
以下是使用枚舉而不使用數值類型的好處:
明確為客戶端代碼指定哪些值是變量的有效值。
在 Visual Studio 中,IntelliSense 列出定義的值。
如果未在枚舉數列表中指定元素的值,則值將自動按 1 遞增。在前面的示例中,Days.Sunday 的值為 0,Days.Monday 的值為 1,依此類推。創建新的 Days 對象時,如果不顯式為其賦值,則它將具有默認值 Days.Sunday (0)。創建枚舉時,應選擇最合理的默認值並賦給它一個零值。這便使得只要在創建枚舉時未為其顯式賦值,則所創建的全部枚舉都將具有該默認值。
如果變量 meetingDay 的類型為 Days,則只能將 Days 定義的某個值賦給它(無需顯式強制轉換)。如果會議日期更改,可以將 Days 中的新值賦給 meetingDay:
Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;
注意:可以將任意整數值賦給 meetingDay。例如,代碼行 meetingDay = (Days) 42 不會產生錯誤。但也不應該這樣做,因為默認約定的是枚舉變量只容納枚舉定義的值之一。將任意值賦給枚舉類型的變量很有可能會導致錯誤。
可以將任意值賦給枚舉類型的枚舉數列表中的元素,也可以使用計算值:
enum
MachineState
{
PowerOff = 0,
Running = 5,
Sleeping = 10,
Hibernating = Sleeping + 5
}
枚舉類型作為位標志
可以使用枚舉類型定義位標志,從而使該枚舉類型的實例可以存儲枚舉數列表中定義的值的任意組合。(當然,某些組合在您的程序代碼中可能沒有意義或不允許使用。)
創建位標志枚舉的方法是應用 System.FlagsAttribute 特性並適當定義一些值,以便可以對這些值執行 AND、OR、NOT 和 XOR 按位運算。在位標志枚舉中包含一個值為零(表示“未設置任何標志”)的命名常量。如果零值不表示“未設置任何標志”,則請不要為標志指定零值。
在下面的示例中,定義了 Days 枚舉的另一個版本,命名為 Days2。 Days2 具有 Flags 特性,且它的每個值都是 2 的若干次冪,指數依次遞增。這樣,您將能夠創建值為 Days2.Tuesday 和 Days2.Thursday 的 Days2 變量。
[Flags]
enum
Days2
{
None = 0x0,
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40
}
class
MyClass
{
Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}
若要在某個枚舉上設置標志,請使用按位 OR 運算符,如下面的示例所示:
? 1 2 3 4 5 6 7 8 9 10 11 12 13// Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday;
// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday;
Console.WriteLine(
"Meeting days are {0}"
, meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday
// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine(
"Meeting days are {0}"
, meetingDays);
// Output: Meeting days are Thursday, Friday
若要確定是否設置了特定標志,請使用按位 AND 運算,如下面的示例所示:
? 1 2 3 4// Test value of flags using bitwise AND.
bool
test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine(
"Thursday {0} a meeting day."
, test ==
true
?
"is"
:
"is not"
);
// Output: Thursday is a meeting day.
。
使用 System.Enum 方法發現和操作枚舉值
所有枚舉都是 System.Enum 類型的實例。不能從 System.Enum 派生新類,但可以使用它的方法發現有關枚舉實例中的值的信息以及操作這些值。
string
s = Enum.GetName(
typeof
(Days), 4);
Console.WriteLine(s);
Console.WriteLine(
"The values of the Days Enum are:"
);
foreach
(
int
i
in
Enum.GetValues(
typeof
(Days)))
Console.WriteLine(i);
Console.WriteLine(
"The names of the Days Enum are:"
);
foreach
(
string
str
in
Enum.GetNames(
typeof
(Days)))
Console.WriteLine(str);