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

深入理解C#之枚舉

 更新時(shí)間:2021年07月08日 17:19:30   作者:逆心  
這篇文章主要介紹了C#中可枚舉類型,IEnumerable和IEnumerator接口及其泛型實(shí)現(xiàn)和迭代器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、在學(xué)習(xí)枚舉之前,首先來聽聽枚舉的優(yōu)點(diǎn)。

1、枚舉能夠使代碼更加清晰,它允許使用描述性的名稱表示整數(shù)值。

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

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

二、枚舉說明

1、簡單枚舉

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

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

方法 名稱
CompareTo 將此實(shí)例與指定對象進(jìn)行比較并返回一個(gè)對二者的相對值的指示
Equals 指示此實(shí)例是否等于指定的對象
Format 根據(jù)指定格式將指定枚舉類型的指定值轉(zhuǎn)換為其等效的字符串表示形式
GetName 在指定枚舉中檢索具有指定值的常數(shù)的名稱
GetNames 檢索指定枚舉中常數(shù)名稱的數(shù)組
GetTypeCode 返回此實(shí)例的基礎(chǔ) TypeCode
GetUnderlyingType 返回指定枚舉的基礎(chǔ)類型
GetValues 索指定枚舉中常數(shù)值的數(shù)組
HasFlag 確定當(dāng)前實(shí)例中是否設(shè)置了一個(gè)或多個(gè)位域
IsDefined 返回指定枚舉中是否存在具有指定值的常數(shù)的指示
Parse 將一個(gè)或多個(gè)枚舉常數(shù)的名稱或數(shù)字值的字符串表示轉(zhuǎn)換成等效的枚舉對象。 一個(gè)參數(shù)指定該操作是否不區(qū)分大小寫
TryParse 將一個(gè)或多個(gè)枚舉常數(shù)的名稱或數(shù)字值的字符串表示轉(zhuǎn)換成等效的枚舉對象。 用于指示轉(zhuǎn)換是否成功的返回值

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

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

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

enum Week
    { 
        Monday = 1,
        Tuesday = 2,
        Wednesday = 3,
        Sunday = 0,
     Everyday = 1  //成員的值可以設(shè)置成一樣的,但是成員不行
    }
  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]);   //關(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();     //此時(shí) Name="劉備"
            Console.WriteLine(Name);
            //由值獲取內(nèi)容
            string Name2 = "關(guān)羽";
            int j = Convert.ToInt32(Enum.Parse(typeof(Man), Name2));     //此時(shí) 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)算。先來看個(gè)例子

  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)算。也就是說,把一個(gè)枚舉運(yùn)算后的結(jié)果存入數(shù)據(jù)庫之后,還能夠按照你的要求讀取出來。比如:

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

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

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

三、枚舉的使用建議

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

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

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

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

下面寫一個(gè):枚舉綁定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>

再來一個(gè)例子,獲取枚舉描述

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
    }

總結(jié)

本篇文章就按到這里了,希望能夠幫助到你,也希望能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • DataGridView清除顯示的數(shù)據(jù)、設(shè)定右鍵菜單

    DataGridView清除顯示的數(shù)據(jù)、設(shè)定右鍵菜單

    這篇文章介紹了DataGridView清除顯示的數(shù)據(jù)、設(shè)定右鍵菜單的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • c#關(guān)于JWT跨域身份驗(yàn)證的實(shí)現(xiàn)代碼

    c#關(guān)于JWT跨域身份驗(yàn)證的實(shí)現(xiàn)代碼

    這篇文章主要介紹了c#關(guān)于JWT跨域身份驗(yàn)證的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • C#?EventHander的具體使用

    C#?EventHander的具體使用

    EventHandler是一種用于處理事件的委托類型,它在C#中用于處理沒有特定參數(shù)或返回值的簡單事件,本文就來介紹C#?EventHander的具體使用,感興趣的可以了解一下
    2025-01-01
  • C#冒泡法排序算法實(shí)例分析

    C#冒泡法排序算法實(shí)例分析

    這篇文章主要介紹了C#冒泡法排序算法,結(jié)合兩個(gè)常用實(shí)例分析了C#冒泡排序算法的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • C#中委托和事件的區(qū)別實(shí)例解析

    C#中委托和事件的區(qū)別實(shí)例解析

    這篇文章主要介紹了C#中委托和事件的區(qū)別,并分別以實(shí)例形式展示了通過委托執(zhí)行方法與通過事件執(zhí)行方法,以及相關(guān)的執(zhí)行流程與原理分析,需要的朋友可以參考下
    2014-09-09
  • C#如何連接服務(wù)器共享文件夾

    C#如何連接服務(wù)器共享文件夾

    這篇文章主要為大家詳細(xì)介紹了C#如何連接服務(wù)器共享文件夾,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C#強(qiáng)制轉(zhuǎn)換和嘗試轉(zhuǎn)換的方法

    C#強(qiáng)制轉(zhuǎn)換和嘗試轉(zhuǎn)換的方法

    這篇文章主要為大家詳細(xì)介紹了C#強(qiáng)制轉(zhuǎn)換和嘗試轉(zhuǎn)換的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • C#實(shí)現(xiàn)的幾種委托方式介紹

    C#實(shí)現(xiàn)的幾種委托方式介紹

    這篇文章主要是介紹C#實(shí)現(xiàn)的幾種委托方式,需要的朋友可以參考下
    2013-03-03
  • c# 使用谷歌身份驗(yàn)證GoogleAuthenticator的示例

    c# 使用谷歌身份驗(yàn)證GoogleAuthenticator的示例

    這篇文章主要介紹了c# 使用谷歌身份驗(yàn)證GoogleAuthenticator的示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C#中的反射(System.Reflection)

    C#中的反射(System.Reflection)

    這篇文章介紹了C#中的反射(System.Reflection),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評論

湖北省| 汤阴县| 万宁市| 河池市| 上虞市| 宣威市| 新巴尔虎右旗| 黔东| 新干县| 无为县| 崇左市| 福贡县| 青海省| 大田县| 通山县| 岳阳县| 灵宝市| 信阳市| 武夷山市| 繁峙县| 娱乐| 西青区| 无极县| 巫溪县| 高要市| 上杭县| 和顺县| 达拉特旗| 中西区| 新晃| 修文县| 汝南县| 长宁区| 株洲市| 寿阳县| 弋阳县| 西丰县| 定边县| 湖南省| 寻甸| 双辽市|