最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年05月19日 09:34:02   投稿:junjie  
這篇文章主要介紹了理解C#中的枚舉(簡明易懂),本文講解了枚舉的優(yōu)點(diǎn)、枚舉說明、枚舉的類型、枚舉的使用建議等內(nèi)容,需要的朋友可以參考下

一、在學(xué)習(xí)枚舉之前,首先來聽聽枚舉的優(yōu)點(diǎn)。
  1、枚舉能夠使代碼更加清晰,它允許使用描述性的名稱表示整數(shù)值。

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

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

二、枚舉說明

1、簡單枚舉

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

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


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

復(fù)制代碼 代碼如下:

    enum sex : byte  //顯示指定枚舉的底層數(shù)據(jù)類型
    {
        male,
        female,  //此逗號可以省略
    };        //此分號可以省略'

  顯式設(shè)置枚舉的成員常量值,默認(rèn)是從0開始,逐個遞增的。但是以下例子卻設(shè)置成了1,2,3,4,5,6,7,0。而且成員值可以一樣的。

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

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

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

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

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

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

            Console.ReadKey();
        }
    }

    enum Man
    {
        劉備 = 1,
        關(guān)羽 = 2,
        張飛 = 3
    }

2、標(biāo)志枚舉

  標(biāo)志枚舉要在頂部加[System.Flags]特性進(jìn)行聲明。而且枚舉支持組合運(yùn)算。先來看個例子

復(fù)制代碼 代碼如下:

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

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

 這種位運(yùn)算是非常有用的,在sql語句里也支持位運(yùn)算。也就是說,把一個枚舉運(yùn)算后的結(jié)果存入數(shù)據(jù)庫之后,還能夠按照你的要求讀取出來。比如:

  將一個"白美"存如數(shù)據(jù)庫的值存入數(shù)據(jù)庫,那么存入去的就是整型5。

  那么我想讀出所有的"白"數(shù)據(jù)列表怎么讀呢?白,可以是純白"1",也是是白富3,可以是白美5,也可以是白富美7,你可以用in來讀,但是更好的方法是在sql語句中同樣使用位運(yùn)算。

復(fù)制代碼 代碼如下:

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

select * from Table1 where  Tag | 1 = Tag

三、枚舉的使用建議

  當(dāng)參數(shù)、返回值、變量等類型可以使枚舉,盡量使用枚舉(要注意考慮分類的穩(wěn)定性)

  大多數(shù)情況下都可以使用int類型枚舉,下列情況除外。

  枚舉可能被大量頻繁的使用,這時為了節(jié)約空間可以使用小于int類型的枚舉。

  標(biāo)志枚舉,且標(biāo)志多于32個。

  下面寫一個:枚舉綁定MVC3下拉列表的示例:

  控制器代碼:

復(fù)制代碼 代碼如下:

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
    }
}

視圖代碼:

復(fù)制代碼 代碼如下:

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

生成的HTML代碼:

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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
    }

相關(guān)文章

  • c# delegate和event的使用說明

    c# delegate和event的使用說明

    這篇文章主要介紹了c# delegate和event的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C# listview添加combobox到單元格的實(shí)現(xiàn)代碼

    C# listview添加combobox到單元格的實(shí)現(xiàn)代碼

    從別處轉(zhuǎn)來的,自己進(jìn)行了一些小的修改,還不錯,你自己先拖一個ListView1和一個ComboBox1,需要的朋友可以參考下
    2014-06-06
  • 關(guān)于C#中的字體別名問題

    關(guān)于C#中的字體別名問題

    在C#中使用Graphics對象的DrawString方法繪制文本時,可以通過設(shè)置TextRenderingHint屬性來控制字體混疊效果,對于14號或更大的字體,建議使用AntiAliasGridFit;對于8到14點(diǎn)之間的字體,建議使用AntiAlias;對于小于8點(diǎn)的字體,建議使用ClearTypeGridFit
    2025-01-01
  • C#訪問命令行的兩種方法

    C#訪問命令行的兩種方法

    這篇文章主要介紹了C#訪問命令行的兩種方法,實(shí)例分析了C#操作命令行的兩種常用技巧,需要的朋友可以參考下
    2015-06-06
  • C#實(shí)現(xiàn)二叉排序樹代碼實(shí)例

    C#實(shí)現(xiàn)二叉排序樹代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于C#實(shí)現(xiàn)二叉排序樹代碼實(shí)例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C#用RabbitMQ實(shí)現(xiàn)消息訂閱與發(fā)布

    C#用RabbitMQ實(shí)現(xiàn)消息訂閱與發(fā)布

    在消息隊(duì)列模型中,如何將消息廣播到所有的消費(fèi)者,這種模式成為“發(fā)布/訂閱”。本文主要以一個簡單的小例子,簡述通過fanout交換機(jī),實(shí)現(xiàn)消息的發(fā)布與訂閱,僅供學(xué)習(xí)分享使用,如有不足之處,還請指正。
    2021-05-05
  • C#集合之有序列表的用法

    C#集合之有序列表的用法

    這篇文章介紹了C#集合之有序列表的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#以流方式讀socket超時設(shè)置的實(shí)例

    C#以流方式讀socket超時設(shè)置的實(shí)例

    這篇文章主要為大家詳細(xì)介紹了C#以流方式讀socket超時設(shè)置的實(shí)例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C#實(shí)現(xiàn)遞歸調(diào)用的Lambda表達(dá)式

    C#實(shí)現(xiàn)遞歸調(diào)用的Lambda表達(dá)式

    這篇文章介紹了C#實(shí)現(xiàn)遞歸調(diào)用的Lambda表達(dá)式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#實(shí)現(xiàn)自定義屏保的示例代碼

    C#實(shí)現(xiàn)自定義屏保的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)自定義屏保的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12

最新評論

郸城县| 大同县| 昭通市| 酒泉市| 前郭尔| 韶山市| 南陵县| 木兰县| 册亨县| 长丰县| 宁津县| 仲巴县| 和林格尔县| 马公市| 武汉市| 沽源县| 资溪县| 大名县| 嘉禾县| 巍山| 易门县| 建宁县| 都兰县| 忻州市| 绍兴县| 神木县| 新晃| 陈巴尔虎旗| 华宁县| 高台县| 芷江| 阿鲁科尔沁旗| 青海省| 鄂伦春自治旗| 随州市| 荆州市| 米易县| 民丰县| 九寨沟县| 双江| 鲁甸县|