枚舉提供成組的常數值,它們有助於使成員成為強型別以及提高代碼的可讀性。在 C# 中,使用 enum 來聲明枚舉。
枚舉分為簡單枚舉和標誌枚舉兩種。
基本文法樣本
enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
以下格式也可以:
enum Day
{
Sun,
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
};
枚舉類型
枚舉類型可以是:byte、sbyte、short、ushort、int、uint、long、ulong,如果沒有指定類型,則預設為 int 類型。指定類型樣本:
enum Day : byte { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
枚舉數的值
預設情況下,第一個枚舉數的值為 0,後面每個枚舉數的值在前一個枚舉數的值基礎上遞增 1。當然,也可以自行指定,例如:
enum Day { Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat };
enum Range { MIN = 0, MAX = 255 };
enum Range2 { MIN, M1 = 50, M2, MAX = 255 }; //MIN 為 0,M2 為 51
枚舉數大小寫敏感
比如以下枚舉有兩個枚舉數:
enum EnumTest { Sun, sun }; //儘管如此,我們仍不推薦這樣寫
取枚舉數的值
雖然枚舉有類型,但取枚舉數的值時,仍然需要進行類型轉換。
public partial class _ENUM : System.Web.UI.Page
{
enum Range { MIN = 0, MAX = 255 };
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(Range.MAX); //輸出為:MAX
Response.Write("<br>");
Response.Write(((int)Range.MAX).ToString()); //輸出為:255
}
}
枚舉不能放在函數中
枚舉可以與類平級,也可以作為類的 field,但不能放在函數中。可以加 public 等修飾符。
以下是使用枚舉時幾條好的建議。
優先考慮使用枚舉,而不是類的靜態常量
比如:
public static class Day
{
public static int Sun = 1;
public static int Mon = 2;
public static int Tue = 3;
//...
}
應該使用如下的枚舉:
enum Day { Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat };
如果參數、傳回值、變數等類型可以是枚舉,則不要使用其它基礎類型
比如:
Range r = Range.MAX; //好
int r = (int)Range.MAX; //不好
枚舉命名
枚舉一般使用名詞或名片語合,簡單枚舉使用單數,標誌枚舉使用複數。
大多數情況下不需要更改枚舉的預設類型
也就是說大多數情況下,使用 int(System.Int32)作為枚舉類型。除非:
- 枚舉是標誌枚舉,且標誌多於 32 個(此時 int 類型裝不下)。
- 枚舉被非常大量且頻繁地使用,為了節約空間使用小於 int 的類型。
- 不得不使用其它類型的情況。
不要在枚舉中設定哨兵
我們可能覺得在枚舉的兩端加上哨兵,這樣在判斷一個數是否在枚舉中時,只需要判斷是否在哨兵之中。非常不幸,我們不應該這麼做,這破壞了枚舉的意義。
enum Day {FirstValue, Sun, Mon, Tue, Wed, Thu, Fri, Sat, LastValue }; //FirstValue、LastValue 應該去掉
- 簡單枚舉包含的值不用於組合,也不用於位元壓縮。
- 標誌枚舉應使用按位 OR 操作進行組合。
簡單枚舉
前面提到的 Day、Range 都可以稱之為簡單枚舉,因為不能將他們各自的值組合起來。
標誌枚舉
標誌枚舉的設計有兩點要注意。
- 指明 FlagsAttribute,以指示可以將枚舉作為位域(即一組標誌)處理。
- 枚舉中各標誌的值應該是以 2 的冪來賦值,即:1、2、4、8、16、32……
舉個例子,假如我們在設計 Windows 視窗程序,視窗有最小化、最大化、關閉按鈕,我們想任意組合顯示,也就是說我們可以顯示其中的任意 0 個或一個或多個按鈕。
如果使用簡單枚舉,按照排列組合,我們要使用 1 + 3 + 3 + 1 = 8 個枚舉數,如果這裡不是三個按鈕,而是四個按鈕,枚舉數就更多了。所以這樣不現實。
為什麼這裡使用簡單枚舉不現實呢?因為簡單枚舉不能組合,採用標誌枚舉就可以輕鬆解決了。
[Flags]
public enum WindowStyle
{
MINIMUM_BUTTON = 1, //十六進位表示為 0x0001
MAXIMUM_BUTTON = 2,
CLOSE_BUTTON = 4
}
我們在設定視窗樣式時,利用 OR 自由組合:
WindowStyle ws = WindowStyle.MINIMUM_BUTTON | WindowStyle.CLOSE_BUTTON; //表示既有 MINIMUM_BUTTON 也有 CLOSE_BUTTON
這就是為什麼標誌的值要按 2 的冪排列的原因了,也是為什麼標誌多於 32 個時不能使用 int 類型的原因了。
通常我們為常用的標誌組合提供特殊的枚舉值
仍然以上述視窗為例,可知大多數情況下,我們均要顯示這三個按鈕,所以每次使用時都要用:
WindowStyle ws = WindowStyle.MINIMUM_BUTTON | MAXIMUM_BUTTON | WindowStyle.CLOSE_BUTTON;
實在有些繁瑣,我們可以修改枚舉為如下:
[Flags]
public enum WindowStyle
{
MINIMUM_BUTTON = 1,
MAXIMUM_BUTTON = 2,
CLOSE_BUTTON = 4,
ALL_BUTTON = 7
}
增加一個 ALL_BUTTON 為前三個標誌的值。使用時直接用 ALL_BUTTON 就可以了。
using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
namespace test
{
public enum Style:int
{
lenovo=1,
acer=2,
dell=3
}
public class PublicBLL
{
private int _itemtype;
public static int ItemType
{
get
{
return _itemtype;
}
set { _itemtype = value; }
}
}
}
PublicBLL.ItemType返回的就是int型的1 or 2 or 3。
如若判斷其值是否等於一個枚舉
if (PublicBll.ItemType==(int)Style.lenovo)
{
//程式碼片段
}