1. 程式人生 > >C#列舉(enum)

C#列舉(enum)

列舉(enum)是什麼?

1.列舉型別宣告為一組相關的符號常數定義了一個型別名稱。列舉用於“多項選擇”場合,就是程式執行時從編譯時已經設定的固定數目的“選擇”中做出決定。
列舉型別(也稱為列舉)為定義一組可以賦給變數的命名整數常量提供了一種有效的方法。例如,假設您必須定義一個變數,該變數的值表示一週中的一天。該變數只能儲存七個有意義的值。若要定義這些值,可以使用列舉型別。列舉型別是使用 enum 關鍵字宣告的。

2。列舉是由一組特定常量構成的一組資料結構,是值型別的一種特殊形式,當需要一個由指定常量集合組成的資料型別時,使用列舉型別。列舉宣告可以顯式地宣告 byte、sbyte、short、ushort、int、uint、long 或 ulong 型別作為對應的基礎型別。沒有顯式地宣告基礎型別的列舉宣告意味著所對應的基礎型別是 int。 

在程式碼中使用列舉,可以將以前笨拙的程式碼變得優雅簡單,更加直觀,方便記憶。

3.列舉是一組命名整型常量。列舉型別是使用 enum 關鍵字宣告的。

C# 列舉是值型別。換句話說,列舉包含自己的值,且不能繼承或傳遞繼承。

 

列舉(enum)如何宣告?

1.列舉型別是使用 enum 關鍵字宣告的。 

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

預設情況下,列舉中每個元素的基礎型別是 int。可以使用冒號指定另一種整數值型別。
如果不為列舉數列表中的元素指定值,則它們的值將以 1 為增量自動遞增。在前面的示例中,Days.Sunday 的值為 0,Days.Monday 的值為 1,依此類推。建立新的 Days 物件時,如果不顯式為其賦值,則它將具有預設值 Days.Sunday (0)。建立列舉時,應選擇最合理的預設值並賦給它一個零值。這便使得只要在建立列舉時未為其顯式賦值,則所建立的全部列舉都將具有該預設值。列舉中大小寫敏感,但是建議不要這樣。

2.宣告列舉的一般語法:

enum <enum_name>
{ 
    enumeration list 
};

其中,

  • enum_name 指定列舉的型別名稱。
  • enumeration list 是一個用逗號分隔的識別符號列表。

列舉列表中的每個符號代表一個整數值,一個比它前面的符號大的整數值。預設情況下,第一個列舉符號的值是 0.例如:

enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

 

列舉(enum)如何使用?

下面的例項演示了列舉變數的用法:

using System;
namespace EnumApplication
{
   class EnumProgram
   {
      enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };

      static void Main(string[] args)
      {
         int WeekdayStart = (int)Days.Mon;
         int WeekdayEnd = (int)Days.Fri;
         Console.WriteLine("Monday: {0}", WeekdayStart);
         Console.WriteLine("Friday: {0}", WeekdayEnd);
         Console.ReadKey();
      }
   }
}

當上面的程式碼被編譯和執行時,它會產生下列結果:

Monday: 1
Friday: 5

簡單列舉(enum)有哪些特點?

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

列舉(enum)類有哪些方法?

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

方法 名稱
CompareTo 將此例項與指定物件進行比較並返回一個對二者的相對值的指示
Equals 指示此例項是否等於指定的物件
Format 根據指定格式將指定列舉型別的指定值轉換為其等效的字串表示形式
GetName 在指定列舉中檢索具有指定值的常數的名稱
GetNames 檢索指定列舉中常數名稱的陣列
GetTypeCode  返回此例項的基礎 TypeCode
GetUnderlyingType 返回指定列舉的基礎型別
GetValues 索指定列舉中常數值的陣列
HasFlag 確定當前例項中是否設定了一個或多個位域
IsDefined 返回指定列舉中是否存在具有指定值的常數的指示
Parse 將一個或多個列舉常數的名稱或數字值的字串表示轉換成等效的列舉物件。 一個引數指定該操作是否不區分大小寫
TryParse 將一個或多個列舉常數的名稱或數字值的字串表示轉換成等效的列舉物件。 用於指示轉換是否成功的返回值

 

如何顯示指定列舉的底層資料型別?

要顯示指定列舉的底層資料型別很簡單,只需在宣告列舉的時候加個冒號,後面緊跟要指定的資料型別。

    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);  //獲取值

.NET中列舉的使用方法?

.NET中的列舉我們一般有兩種常見用法,一是表示唯一的元素序列,例如一週裡的各天,訂單狀態,文章型別等;還有就是用來表示多種複合的狀態,例如表示許可權,因為可同時有多個不同許可權。

 

什麼是標誌列舉?

 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

簡單列舉,不能將他們各自的值組合起來。

標誌列舉的設計有兩點要注意。

  • 指明 FlagsAttribute,以指示可以將列舉作為位域(即一組標誌)處理。
  • 列舉中各標誌的值應該是以 2 的冪來賦值,即:1、2、4、8、16、32……

舉個例子,假如我們在設計 Windows 視窗程式,視窗有最小化、最大化、關閉按鈕,我們想任意組合顯示,也就是說我們可以顯示其中的任意 0 個或一個或多個按鈕。

如果使用簡單列舉,按照排列組合,我們要使用 1 + 3 + 3 + 1 = 8 個列舉數,如果這裡不是三個按鈕,而是四個按鈕,列舉數就更多了。所以這樣不現實。

為什麼這裡使用簡單列舉不現實呢?因為簡單列舉不能組合,採用標誌列舉就可以輕鬆解決了。

[Flags]
public enum WindowStyle
{
    MINIMUM_BUTTON = 1, //十六進位制表示為 0x0001
    MAXIMUM_BUTTON = 2,
    CLOSE_BUTTON = 4
}

我們在設定視窗樣式時,利用 OR 自由組合:

WindowStyle ws = WindowStyle.MINIMUM_BUTTON | WindowStyle.CLOSE_BUTTON; //表示既有 MINIMUM_BUTTON 也有 CLOSE_BUTTON

這就是為什麼標誌的值要按 2 的冪排列的原因了,也是為什麼標誌多於 32 個時不能使用 int 型別的原因了。

通常我們為常用的標誌組合提供特殊的列舉值

仍然以上述視窗為例,可知大多數情況下,我們均要顯示這三個按鈕,所以每次使用時都要用:

WindowStyle ws = WindowStyle.MINIMUM_BUTTON | MAXIMUM_BUTTON | WindowStyle.CLOSE_BUTTON;

實在有些繁瑣,我們可以修改列舉為如下:

[Flags]
public enum WindowStyle
{
    MINIMUM_BUTTON = 1,
    MAXIMUM_BUTTON = 2,
    CLOSE_BUTTON = 4,
    ALL_BUTTON = 7
}

增加一個 ALL_BUTTON 為前三個標誌的值。使用時直接用 ALL_BUTTON 就可以了。

 

列舉(enum)的優點是什麼?

1.列舉的優點:
列舉可以使程式碼更易於維護,有助於確保給變數指定合法的、期望的值。

列舉使程式碼更清晰,允許用描述性的名稱表示整數值,而不是用含義模糊的數來表示。

列舉使程式碼更易於鍵入。在給列舉型別的例項賦值時,VS.NET IDE會通過IntelliSense彈出一個包含可接受值的列表框,減少了按鍵次數,並能夠讓我們回憶起可能的值

2.列舉的優點

列舉能夠使程式碼更加清晰,它允許使用描述性的名稱表示整數值。

列舉使程式碼更易於維護,有助於確保給變數指定合法的、期望的值。

列舉使程式碼更易輸入。

 

列舉(enum)適用於什麼場合?

列舉在什麼地方適用呢?一條普遍規則是,任何使用常量的地方,例如目前用 switch 程式碼切換常量的地方。如果只有單獨一個值(例如,鞋的最大尺寸,或者籠子中能裝猴子的最大數目),則還是把這個任務留給常量吧。但是,如果定義了一組值,而這些值中的任何一個都可以用於特定的資料型別,那麼將列舉用在這個地方最適合不過。

        例1:一個欄位表示型別。你可以使用整數1、2、3代表原創轉載翻譯三種類型。這種表示法可以使用,但它不直觀。此時應該使用列舉。

        例2:表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY, 就是應該定義成一個列舉。

列舉與整型之間如何顯式轉換?

enum Color
 {
            RED,GREEN,BLUE
  }

列舉轉換為整形
int a = (int)Color.RED;

整形轉換為列舉
Color c;
c = (Color) 1;
轉換為同一型別,便於比較。