1. 程式人生 > 程式設計 >快速學習c# 列舉

快速學習c# 列舉

一、在學習列舉之前,首先來聽聽列舉的優點。

  1、列舉能夠使程式碼更加清晰,它允許使用描述性的名稱表示整數值。

  2、列舉使程式碼更易於維護,有助於確保給變數指定合法的、期望的值。

  3、列舉使程式碼更易輸入。

二、列舉說明

  1、簡單列舉

(1)列舉使用enum關鍵字來宣告,與類同級。列舉本身可以有修飾符,但列舉的成員始終是公共的,不能有訪問修飾符。列舉本身的修飾符僅能使用public和internal

(2)列舉是值型別,隱式繼承自System.Enum,不能手動修改。System.Enum本身是引用型別,繼承自System.ValueType。

(3)列舉都是隱式密封的,不允許作為基類派生子類。

(4)列舉型別的列舉成員均為靜態,且預設為Int32型別。

(5)每個列舉成員均具有相關聯的常數值。此值的型別就是列舉的底層資料型別。每個列舉成員的常數值必須在該列舉的底層資料型別的範圍之內。如果沒有明確指定底層資料型別則預設的資料型別是int型別。

(6)列舉成員不能相同,但列舉的值可以相同。

(7)列舉最後一個成員的逗號和大括號後面的分號可以省略

  C#提供類一個類來方便操作列舉,下面給出這個類的常用方法:

方法 名稱
CompareTo 將此例項與指定物件進行比較並返回一個對二者的相對值的指示
Equals 指示此例項是否等於指定的物件
Format 根據指定格式將指定列舉型別的指定值轉換為其等效的字串表示形式
GetName 在指定列舉中檢索具有指定值的常數的名稱
GetNames 檢索指定列舉中常數名稱的陣列
GetTypeCode 返回此例項的基礎 TypeCode
GetUnderlyingType 返回指定列舉的基礎型別
GetValues 索指定列舉中常數值的陣列
HasFlag 確定當前例項中是否設定了一個或多個位域
IsDefined 返回指定列舉中是否存在具有指定值的常數的指示
Parse 將一個或多個列舉常數的名稱或數字值的字串表示轉換成等效的列舉物件。 一個引數指定該操作是否不區分大小寫
TryParse 將一個或多個列舉常數的名稱或數字值的字串表示轉換成等效的列舉物件。 用於指示轉換是否成功的返回值

  要顯示指定列舉的底層資料型別很簡單,只需在宣告列舉的時候加個冒號,後面緊跟要指定的資料型別。

 enum sex : byte  //顯示指定列舉的底層資料型別
 { 
  male,female,  //此逗號可以省略
 };       //此分號可以省略

  顯式設定列舉的成員常量值,預設是從0開始,逐個遞增的。但是以下例子卻設定成了1,2,3,4,5,6,7,0。而且成員值可以一樣的。

enum Week
 { 
  Monday = 1,Tuesday = 2,Wednesday = 3,Sunday = 0,     Everyday = 1  //成員的值可以設定成一樣的,但是成員不行
 }
  Console.WriteLine((int)Week.Monday);  //獲取值

  示例,由列舉值獲取列舉名稱與由列舉名稱獲取列舉值

class Program
 {
  static void Main(string[] args)
  {
   Console.WriteLine(Enum.GetName(typeof(Man),1)); //還是 劉備 (由值獲取名字)

   string[] array1 = Enum.GetNames(typeof(Man));
   Console.WriteLine(array1[1]); //關羽

   Array array2 = Enum.GetValues(typeof(Man));
   Console.WriteLine(array2.GetValue(1)); //還是關羽

   Type t = Enum.GetUnderlyingType(typeof(Man));
   Console.WriteLine(t);  //輸出 Int32

   //由值獲取內容
   int i = 1;
   string Name = Enum.Parse(typeof(Man),i.ToString()).ToString();  //此時 Name="劉備"
   Console.WriteLine(Name);

   //由值獲取內容
   string Name2 = "關羽";
   int j = Convert.ToInt32(Enum.Parse(typeof(Man),Name2));  //此時 j=2
   Console.WriteLine(j);

   Console.ReadKey();
  }
 }

 enum Man
 { 
  劉備 = 1,關羽 = 2,張飛 = 3
 }

  2、標誌列舉

  標誌列舉要在頂部加[System.Flags]特性進行宣告。而且列舉支援組合運算。先來看個例子

class Program
 {
  static void Main(string[] args)
  {
   var man = Week.白 | Week.美; //賦值為101 計算方法001或上100,結果是101
   Console.WriteLine((int)man);
   if ((man & Week.白) == Week.白)  //101 man 
   {         //001 白 逐位相與,
    Console.WriteLine("此人白");  //001 如果結果是白,就可以反推出man包含 白
   }
   else
   {
    Console.WriteLine("此人黑");
   }
   Console.ReadKey();
  }
 }

 [System.Flags]
 public enum Week
 { 
  白 = 1,//001
  富 = 2,//010
  美 = 4,//100
 }

  這種位運算是非常有用的,在sql語句裡也支援位運算。也就是說,把一個列舉運算後的結果存入資料庫之後,還能夠按照你的要求讀取出來。比如:

  將一個"白美"存如資料庫的值存入資料庫,那麼存入去的就是整型5。

  那麼我想讀出所有的"白"資料列表怎麼讀呢?白,可以是純白"1",也是是白富3,可以是白美5,也可以是白富美7,你可以用in來讀,但是更好的方法是在sql語句中同樣使用位運算。

select * from Table1 where Tag & 1 = 1  //Tag是列名

select * from Table1 where Tag | 1 = Tag

三、列舉的使用建議

  當引數、返回值、變數等型別可以使列舉,儘量使用列舉(要注意考慮分類的穩定性)

  大多數情況下都可以使用int型別列舉,下列情況除外。

  列舉可能被大量頻繁的使用,這時為了節約空間可以使用小於int型別的列舉。

  標誌列舉,且標誌多於32個。

  下面寫一個:列舉繫結MVC3下拉列表的示例:

  控制器程式碼:

namespace MvcStart.Controllers
{
 public class HomeController : Controller
 {
  public ActionResult GetSexList()
  {
   Dictionary<string,int> Sexlist = new Dictionary<string,int>();
   string[] keys = Enum.GetNames(typeof(sex));
   Array values = Enum.GetValues(typeof(sex));

   for (int i = 0; i < keys.Length; i++)
   {
    Sexlist.Add(keys[i],(int)values.GetValue(i));
   }

   return View(Sexlist);
  }
 }

 public enum sex
 { 
  male = 1,female = 2,other = 3
 }
}

檢視程式碼:

@model Dictionary<string,int>
<select>
 @foreach(var item in @Model)
 {
  <option value="@item.Value">@item.Key</option>
 }
</select>

生成的HTML程式碼:

<select>
  <option value="1">male</option>
  <option value="2">female</option>
  <option value="3">other</option>
</select>

再來一個例子,獲取列舉描述

public static class GetDescription
 {
  /// <summary>
  /// 獲取描述資訊
  /// </summary>
  /// <param name="en"></param>
  /// <returns></returns>
  public static string description(this Enum en)
  {
   Type type = en.GetType();
   MemberInfo[] memInfo = type.GetMember(en.ToString());
   if (memInfo != null && memInfo.Length > 0)
   {
    object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute),false);
    if (attrs != null && attrs.Length > 0)
     return ((DescriptionAttribute)attrs[0]).Description;
   }
   return en.ToString();
  }
 }

 public enum Sex
 {
  [Description("男")]
  man = 1,[Description("女")]
  woman = 2,[Description("其他")]
  other = 3
 }

以上就是快速學習c# 列舉的詳細內容,更多關於c# 列舉的資料請關注我們其它相關文章!