国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

理解C#中的枚舉(簡明易懂)

2020-01-24 01:50:20
字體:
來源:轉載
供稿:網友

一、在學習枚舉之前,首先來聽聽枚舉的優點。
  1、枚舉能夠使代碼更加清晰,它允許使用描述性的名稱表示整數值。

  2、枚舉使代碼更易于維護,有助于確保給變量指定合法的、期望的值。

  3、枚舉使代碼更易輸入。

二、枚舉說明

1、簡單枚舉

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

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


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

復制代碼 代碼如下:

    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
    }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿克| 鄢陵县| 安龙县| 兴城市| 喀喇沁旗| 汉中市| 茂名市| 射阳县| 申扎县| 冷水江市| 滦平县| 长顺县| 濮阳县| 荥经县| 浦北县| 新乡县| 吴江市| 横山县| 阜南县| 佛山市| 临海市| 靖边县| 宁蒗| 敦煌市| 房产| 桐乡市| 汽车| 鄯善县| 阿克陶县| 贵定县| 论坛| 巴楚县| 谢通门县| 漳平市| 柏乡县| 泌阳县| 大竹县| 新竹市| 贵溪市| 新乡县| 芜湖市|