關於c# 枚舉 enum 的學習
從長遠來看,創建枚舉可以節省大量的時間,減少許多麻煩。使用枚舉比使用無格式的整數至少有如下三個優勢:
● 枚舉可以使代碼更易於維護,有助於確保給變量指定合法的、期望的值。
● 枚舉使代碼更清晰,允許用描述性的名稱表示整數值,而不是用含義模煳的數來表示。
● 枚舉使代碼更易於鍵入。在給枚舉類型的實例賦值時,VS.NET IDE會通過IntelliSense彈出一個包含可接受值的列表框,減少了按鍵次數,並能夠讓我們回憶起可能的值。
public enum FileStates{Begin=1,Pause=2,RollBack=3,Success=4};枚舉類型都是值類型。System.Enum是一個抽象類(abstract class),所有枚舉類型都直接繼承自它,當然也同時繼承了它的所有成員。所有的值類型都是System.ValueType的後代,枚舉類型也不例外,枚舉類型直接繼承自System.Enum,而System.Enum卻又直接繼承自System.ValueType的,所以,枚舉類型也是System.ValueType的後代。
值類型都是System.ValueType的後代”,但System.ValueType的後代不全是值類型,System.Enum就是唯一的特例!在System.ValueType的所有後代中,除了System.Enum之外其它都是值類型。事實上,我們可以在.NET的源代碼中找到System.Enum的聲明:

- 4. System.Enum是一個特例,它直接繼承自System.ValueType,但本身卻是一個引用類型。
A:枚舉類型可以被裝箱成System.Enum、System.ValueType、System.Object或者System.IConvertible、System.IFormattable、System.IComparable。
注意:在.NET 1.1上,枚舉類型隻能被裝箱到System.Enum、System.ValueType、System.Object;而在.NET 2.0上,枚舉類型還能被裝箱到System.Enum所實現的三個接口:System.IConvertible、System.IComparable、System.IFormattable。對應的裝箱操作既可以為隱式的也可以是顯式的。
枚舉類型與整數類型有一定的關係。事實上,每一個枚舉類型都有與之相對應的整數類型,我們稱該整數類型為底層類型(underlying type),默認的情況下使用,.NET使用System.Int32。當然,你可以手動將其指定為其他的整數類型:
能被指定為枚舉的底層類型的隻能是如下所列的整數類型:, , , , , , , 。
如果你沒有手動指定成員的值的話,從上往下看,各成員的值為:0, 1, 2, ...。說罷了,就是一個非負整數等差數列,其初值為0,步長為1。例如:
public enum Alignment
{
Left, // 0
Center, // 1
Right // 2
}
那麼被賦值的成員的值就是你所指定的值。當然,無論你是否手動指定枚舉成員的值,遞增步長都不會變,總是為1。為了測試你是否理解,請說出下麵枚舉個成員的值以及你的判斷理由(請用人腦而不是電腦來運行以下代碼):
public enum DriveType : sbyte
{
CDRom,
Fixed = -2,
Network,
NoRootDirectory = -1,
Ram,
Removable = Network * NoRootDirectory,
Unknown
}
public enum CustomerKind
{
Normal = 90,
Vip = 80,
SuperVip = 70,
InActive = 100
}
public class Customer
{
public readonly CustomerKind Kind;
private double m_Payment;
public double Payment
{
return m_Payment * (int)Kind / 100;
}
為枚舉CustomerKind的每個成員都賦了一個特定的值,該值其實就是顧客購物折扣百分率。而在Customer類中,Payment屬性就通過強類型轉換來獲取枚舉成員的值(也就是購物折扣率),並用於貨款計算。從這裏可以看出,獲取枚舉成員的值還可以通過強類型轉換方式。 // Code here
}
枚舉類型可以強製轉換為整數,整數也可以強製轉換為枚舉類型
Alignment a = (Alignment)1;但這種機製可能使你遇到一些麻煩
public static bool IsAlignment(Alignment a)
{
switch(a)
{
case Alignment.Left:
case Alignment.Center:
case Alignment.Right:
return true;
default:
return false;
} }
枚舉類型轉換(解析)成字符串類型
最簡單的方法就是使用System.Enum的public override string ToString(); 或者把枚舉類型轉換為IConvertible接口,再調用該接口的string ToString(IFormatProvider provider);
static void Main()
{
Alignment a = Alignment.Right;
Console.WriteLine("Alignment is {0}.", a.ToString());
FontStyle fs = FontStyle.Bold | FontStyle.Underline;
Console.WriteLine("FontStyle is {0}.", fs.ToString());
}
手動指定格式參數:Console.WriteLine("Alignment is {0}.", a.ToString("d"));
這時你就需要System.Enum的public static object Parse( Type enumType, string value, bool ignoreCase );
static void Main()













不應該使用枚舉的情況:

最後更新:2017-04-02 00:06:39