枚舉

 1   public void print()
 2         {
 3                 string b = Console.ReadLine();
 4                 object a = (AppKey)Enum.Parse(typeof(AppKey), b);
 5                 Console.WriteLine(a);         
 6         }
 7 
 8 
 9         public enum AppKey
10         {
11             a,
12             b,
13             c,
14             d,
15             e
16         }

一直對枚舉類型不太熟  今天花時間試試 而後看看別人寫的文章html

以上是本身簡單寫的代碼 發現不論是傳遞int仍是枚舉的實際值,返回的也都是枚舉的值  也就是說 傳遞0 和傳遞a   返回的都是asql

 
 
一下內容出處  http://www.cnblogs.com/kissdodog/archive/2013/01/16/2863515.html   感謝做者
 
 
 

1、在學習枚舉以前,首先來聽聽枚舉的優勢。

  一、枚舉可以使代碼更加清晰,它容許使用描述性的名稱表示整數值。數據庫

  二、枚舉使代碼更易於維護,有助於確保給變量指定合法的、指望的值。數組

  三、枚舉使代碼更易輸入。post

2、枚舉說明

  一、簡單枚舉學習

  • 枚舉使用enum關鍵字來聲明,與類同級。枚舉自己能夠有修飾符,但枚舉的成員始終是公共的,不能有訪問修飾符。枚舉自己的修飾符僅能使用public和internal。
  • 枚舉是值類型,隱式繼承自System.Enum,不能手動修改。System.Enum自己是引用類型,繼承自System.ValueType。
  • 枚舉都是隱式密封的,不容許做爲基類派生子類。
  • 枚舉類型的枚舉成員均爲靜態,且默認爲Int32類型。
  • 每一個枚舉成員均具備相關聯的常數值。此值的類型就是枚舉的底層數據類型。每一個枚舉成員的常數值必須在該枚舉的底層數據類型的範圍以內。若是沒有明確指定底層數據類型則默認的數據類型是int類型。
  • 枚舉成員不能相同,但枚舉的值能夠相同。
  • 枚舉最後一個成員的逗號和大括號後面的分號能夠省略

  C#提供類一個類來方便操做枚舉,下面給出這個類的經常使用方法:this

方法 名稱
CompareTo 將此實例與指定對象進行比較並返回一個對兩者的相對值的指示
Equals 指示此實例是否等於指定的對象
Format 根據指定格式將指定枚舉類型的指定值轉換爲其等效的字符串表示形式
GetName 在指定枚舉中檢索具備指定值的常數的名稱
GetNames 檢索指定枚舉中常數名稱的數組
GetTypeCode  返回此實例的基礎 TypeCode
GetUnderlyingType 返回指定枚舉的基礎類型
GetValues 索指定枚舉中常數值的數組
HasFlag 肯定當前實例中是否設置了一個或多個位域
IsDefined 返回指定枚舉中是否存在具備指定值的常數的指示
Parse 將一個或多個枚舉常數的名稱或數字值的字符串表示轉換成等效的枚舉對象。 一個參數指定該操做是否不區分大小寫
TryParse 將一個或多個枚舉常數的名稱或數字值的字符串表示轉換成等效的枚舉對象。 用於指示轉換是否成功的返回值

 

  要顯示指定枚舉的底層數據類型很簡單,只需在聲明枚舉的時候加個冒號,後面緊跟要指定的數據類型。url

    enum sex : byte  //顯示指定枚舉的底層數據類型
    { 
        male,
        female,  //此逗號能夠省略
    };        //此分號能夠省略

  顯式設置枚舉的成員常量值,默認是從0開始,逐個遞增的。可是如下例子卻設置成了1,2,3,4,5,6,7,0。並且成員值能夠同樣的。spa

複製代碼
    enum Week
    { 
        Monday = 1,
        Tuesday = 2,
        Wednesday = 3,
        Sunday = 0,
     Everyday = 1  //成員的值能夠設置成同樣的,可是成員不行
    }
  Console.WriteLine((int)Week.Monday);  //獲取值
複製代碼

  示例,由枚舉值獲取枚舉名稱與由枚舉名稱獲取枚舉值code

複製代碼
    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
    }
複製代碼

 

  二、標誌枚舉

  標誌枚舉要在頂部加[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

 

3、枚舉的使用建議

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

  大多數狀況下均可以使用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
    }
複製代碼
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息