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個。 

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

以上就是C# 枚舉的使用簡介的詳細內容,更多關於C# 枚舉的資料請關註WalkonNet其它相關文章!

推薦閱讀: