C# 枚舉類使用

來源:互聯網
上載者:User
本文轉自:http://hi.baidu.com/mycolorwind/blog/item/5a1770de16e90e5294ee37d0.html

從長遠來看,建立枚舉可以節省大量的時間,減少許多麻煩。使用枚舉比使用無格式的整數至少有如下三個優勢:

●       枚舉可以使代碼更易於維護,有助於確保給變數指定合法的、期望的值。

●       枚舉使代碼更清晰,允許用描述性的名稱表示整數值,而不是用含義模糊的數來表示。

●       枚舉使代碼更易於鍵入。在給枚舉類型的執行個體賦值時,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的聲明:

public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible
  • 1. 所有枚舉類型(enum type)都是實值型別。
  • 2. System.Enum和System.ValueType本身是參考型別。
  • 3. 枚舉類型(enum type)都是隱式的直接繼承自System.Enum,並且這種繼承關係只能由編譯器自動延伸。但System.Enum本身不是枚舉類型(enum type)。
  • 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。當然,你可以手動將其指定為其他的整數類型:
能被指定為枚舉的底層類型的只能是如下所列的整數類型:byte, sbyte, short, ushort, int, uint, long, ulong。


如果你沒有手動指定成員的值的話,從上往下看,各成員的值為: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()
{
      string name = "Right";
       Alignment a = (Alignment)Enum.Parse(typeof(Alignment), name, false);

       Console.WriteLine(a.ToString());

      string names = "Bold, Italic, Underline";
       FontStyle fs = (FontStyle)Enum.Parse(typeof(FontStyle), names, false);

       Console.WriteLine(fs.ToString());
   }

不應該使用枚舉的情況:
枚舉類型表達了一種穩定的分類標準。當你查看.NET Framework BCL中的枚舉類型,你會發現它們幾乎沒有任何改變的可能或者趨勢,表現出一種穩定性。所以,當你所要表達的分類標準也同樣具備這種穩定性時,你就可以考慮枚舉類型了。那麼什麼情況下不使用枚舉呢?一般說來,當分類標準不閉合時——即新的子分類隨時有可能產生或者現有子分類隨時有可能被替換——你就應該考慮使用其他的方式來表達了.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.