C#枚舉的簡單使用


枚舉這個名詞大家都聽過,很多小伙伴也使用過,

那么枚舉在開發中能做什么,使用它后能給程序代碼帶來什么改變,為什么用枚舉。

各位看官且坐下,聽我一一道來。


 

為什么使用枚舉?

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

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

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


 

枚舉有哪些用法?

1、簡單枚舉

2、標志枚舉


 

1、簡單枚舉

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

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

C#枚舉常用方法
方法 名稱
CompareTo 將此實例與指定對象進行比較並返回一個對二者的相對值的指示
Equals 指示此實例是否等於指定的對象
Format 根據指定格式將指定枚舉類型的指定值轉換為其等效的字符串表示形式
GetName 在指定枚舉中檢索具有指定值的常數的名稱
GetNames 檢索指定枚舉中常數名稱的數組
GetNames 檢索指定枚舉中常數名稱的數組
GetTypeCode 返回此實例的基礎 TypeCode
GetUnderlyingType 返回指定枚舉的基礎類型
GetValues 索指定枚舉中常數值的數組
HasFlag 確定當前實例中是否設置了一個或多個位域
IsDefined 返回指定枚舉中是否存在具有指定值的常數的指示
Parse

將一個或多個枚舉常數的名稱或數字值的字符串表示轉換成等效的枚舉對象。 一個參數指定該操作是否不區分大小寫

TryParse

將一個或多個枚舉常數的名稱或數字值的字符串表示轉換成等效的枚舉對象。 用於指示轉換是否成功的返回值

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

如果要顯示指定枚舉的底層數據類型很簡單,只需在聲明枚舉的時候加個冒號,后面緊跟要指定的數據類型(可指定類型有:byte、sbyte、short、ushort、int、uint、long、ulong)。

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

如下示例:由枚舉值獲取枚舉名稱與由枚舉名稱獲取枚舉值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace enumApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            //輸出方式一:
            Console.WriteLine("我是四大名著之一的:" + Enum.GetName(typeof(Man), 1));  //西游記(是哪個名著由值獲取)

            //輸出方式二:
            string[] array1 = Enum.GetNames(typeof(Man));
            Console.WriteLine("我是四大名著之一的:" + array1[2]);   //紅樓夢(是哪個名著由值獲取)

            //輸出方式三:
            Array array2 = Enum.GetValues(typeof(Man));
            Console.WriteLine("我是四大名著之一的:" + array2.GetValue(3));  //三國演義(是哪個名著由值獲取)

            //輸出方式四:
            Type t = Enum.GetUnderlyingType(typeof(Man));
            Console.WriteLine("我輸出的是值類型:"+t);       //輸出 Int32

            //輸出方式五:由值獲取內容
            int i = 0;
            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:int //四大名著枚舉
        {
            西游記 = 1,
            紅樓夢 = 2,
            三國演義 = 3,
            水滸傳 = 0
        }
    }
}

 

2、標志枚舉

標志枚舉要在頂部加[System.Flags]特性進行聲明。而且枚舉支持組合運算。

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

將一個"高帥"存如數據庫的值存入數據庫,那么存入去的就是整型5。

select * from Table where Column & 1 = 1  //Column 是列名

select * from Table1 where  Column  | 1 = Column 

如下demo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace enumApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var man = People.高 | People.帥;  //賦值為101    計算方法001或上100,結果是101
            Console.WriteLine("高和帥的枚舉值和為:"+(int)man);
            if ((man & People.高) == People.高)       //101 man 
            {                                    //001 高 逐位相與,
                Console.WriteLine("此人:高");      //001 如果結果是高,就可以反推出man包含 高
            }
            else
            {
                Console.WriteLine("此人:矮");
            }
            Console.ReadKey();
        }

       [System.Flags]
       public enum People:int 
        {
            高 = 1,  //001
            富 = 2,  //010
            帥 = 4,  //100
        }
    }
}

 

3、枚舉使用的一些建議

  • 作為參數、返回值、變量等類型可以使枚舉,盡量使用枚舉(要注意考慮分類的穩定性)
  • 大多數情況下都可以使用int類型枚舉,下列情況除外。
  • 枚舉可能被大量頻繁的使用,這時為了節約空間可以使用小於int類型的枚舉。
  • 標志枚舉,且標志多於32個。

 

枚舉用好了還是蠻方便的,大家不妨去試試。

 

歡迎關注訂閱我的微信公眾平台【熊澤有話說】,更多好玩易學知識等你來取
作者:熊澤-學習中的苦與樂
公眾號:熊澤有話說
出處:https://www.cnblogs.com/xiongze520/p/10271350.html
創作不易,任何人或團體、機構全部轉載或者部分轉載、摘錄,請在文章明顯位置注明作者和原文鏈接。  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM