1. 程式人生 > >c#-Enum列舉

c#-Enum列舉

本文轉載自:https://www.cnblogs.com/yank/archive/2009/02/27/1399423.html

列舉

  列舉型別宣告為一組相關的符號常數定義了一個型別名稱。列舉用於“多項選擇”場合,就是程式執行時從編譯時已經設定的固定數目的“選擇”中做出決定。

  列舉型別(也稱為列舉)為定義一組可以賦給變數的命名整數常量提供了一種有效的方法。例如,假設您必須定義一個變數,該變數的值表示一週中的一天。該變數只能儲存七個有意義的值。若要定義這些值,可以使用列舉型別。列舉型別是使用 enum 關鍵字宣告的。 

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


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

  注意:System.Enum 型別是所有列舉型別的抽象基類(它是一種與列舉型別的基礎型別不同的獨特型別),並且從 System.Enum 繼承的成員在任何列舉型別中都可用。存在從任何列舉型別到System.Enum 的裝箱轉換,並且存在從 System.Enum 到任何列舉型別的取消裝箱轉換。

System.Enum 本身不是列舉型別。相反,它是一個類型別,所有列舉型別都是從它派生的。型別 System.Enum 從型別 System.ValueType派生,而後者又從型別 object 派生。在執行時,型別 System.Enum 的值可以是 null 或是對任何列舉型別的裝了箱的值的引用。

列舉的優點:
1、列舉可以使程式碼更易於維護,有助於確保給變數指定合法的、期望的值。
2、列舉使程式碼更清晰,允許用描述性的名稱表示整數值,而不是用含義模糊的數來表示。
3、列舉使程式碼更易於鍵入。在給列舉型別的例項賦值時,VS.NET IDE會通過IntelliSense彈出一個包含可接受值的列表框,減少了按鍵次數,並能夠讓我們回憶起可能的值

列舉例項

  宣告: 

publicenum TimeOfDay
{
    Moning 
=0,
    Afternoon 
=1,
    Evening 
=2,
};

  使用: 

複製程式碼 publicstring getTimeOfDay(TimeOfDay time)
    {
        
string result =string.Empty;
        
switch (time)
        {
            
case TimeOfDay.Moning:
                result 
="上午";
                
break;
            
case TimeOfDay.Afternoon:
                result 
="下午";
                
break;
            
case TimeOfDay.Evening:
                result 
="晚上";
                
break;
            
default:
                result 
="未知";
                
break;
        }
        
return result;
    }
複製程式碼

列舉方法 

1、獲取列舉字串

TimeOfDay time = TimeOfDay.Afternoon;

Console.WriteLine(time.ToString());
//輸出:Afternoon

2、Enum.Parse()方法。這個方法帶3個引數,第一個引數是要使用的列舉型別。其語法是關鍵字typeof後跟放在括號中的列舉類名。typeof運算子將在第5章詳細論述。第二個引數是要轉換的字串,第三個引數是一個bool,指定在進行轉換時是否忽略大小寫。最後,注意Enum.Parse()方法實際上返回一個物件引用——我們需要把這個字串顯式轉換為需要的列舉型別(這是一個取消裝箱操作的例子)。對於上面的程式碼,將返回1,作為一個物件,對應於TimeOfDay.Afternoon的列舉值。在顯式轉換為int時,會再次生成1。

TimeOfDay time2 = (TimeOfDay) Enum.Parse(typeof(TimeOfDay), "afternoon"true);

Console.WriteLine((
int)time2);//輸出1

3、得到列舉的某一值對應的名稱

lbOne.Text = Enum.GetName(typeof(TimeOfDay), 0); lbOne.Text = ((TimeOfDay)0).ToString();//返回:Morning

兩種方法都能實現,但是當其值越界(不是列舉所列出的值),就有一定的區別了。大家可以根據自己的需求不同,選擇合適的方法。

lbCon.Text = ((TimeOfDay)5).ToString(); //返回:5,如果越界返回原值this.lbGetName.Text = Enum.GetName(typeof(TimeOfDay), 5); //返回:空字串,如果越界返回空字串

4、得到列舉的所有的值 

foreach (int i in Enum.GetValues(typeof(TimeOfDay)))
            lbValues.Text 
+= i.ToString();

5、列舉所有的名稱 

foreach(string temp in Enum.GetNames(typeof(TimeOfDay)))
            lbNames.Text
+=temp;

列舉和常量

  優先考慮列舉。

  在C#中,列舉的真正強大之處是它們在後臺會例項化為派生於基類System.Enum的結構。這表示可以對它們呼叫方法,執行有用的任務。注意因為.NET Framework的執行方式,在語法上把列舉當做結構是不會有效能損失的。實際上,一旦程式碼編譯好,列舉就成為基本型別,與int和float類似。

  但是在實際應用中,你也許會發現,我們經常用英語定義列舉型別,因為開發工具本來就是英文開發的,美國人用起來,就直接能夠明白列舉型別的含義。其實,我們在開發的時候就多了一步操作,需要對列舉型別進行翻譯。沒辦法,誰讓程式語言是英語寫的,如果是漢語寫的,那我們也就不用翻譯了,用起列舉變得很方便了。舉個簡單的例子,TimeOfDay.Morning一看到Morning,美國人就知道是上午,但是對於中國的使用者來說,可能有很多人就看不懂,這就需要我們進行翻譯、解釋,就向上面的getTimeOfDay()的方法,其實就是做了翻譯工作。所以,在使用列舉的時候,感覺到並不是很方便,有的時候我們還是比較樂意建立常量,然後在類中,宣告一個集合來容納常量和其意義。

  使用常量定義:這種方法固然可行,但是不能保證傳入的引數day就是實際限定的。

複製程式碼 using System;
using System.Collections.Generic;

publicclass TimesOfDay
{
    
publicconstint Morning =0;
    
publicconstint Afternoon =1;
    
publicconstint Evening =2;
    
publicstatic Dictionary<intstring> list;
    
///<summary>/// 獲得星期幾
    
///</summary>///<param name="day"></param>///<returns></returns>publicstaticstring getTimeNameOfDay(int time)
    {
        
if (list ==null|| list.Count <=0)
        {
            list 
=new Dictionary<intstring>();
            list.Add(Morning, 
"上午");
            list.Add(Afternoon, 
"下午");
            list.Add(Evening, 
"晚上");
        }

        
return list[time];
    }
}

複製程式碼