程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#的Enum枚舉詳解

C#的Enum枚舉詳解

編輯:C#基礎知識
枚舉

  枚舉類型聲明為一組相關的符號常數定義了一個類型名稱。枚舉用於“多項選擇”場合,就是程序運行時從編譯時已經設定的固定數目的“選擇”中做出決定。

  枚舉類型(也稱為枚舉)為定義一組可以賦給變量的命名整數常量提供了一種有效的方法。例如,假設您必須定義一個變量,該變量的值表示一周中的一天。該變量只能存儲七個有意義的值。若要定義這些值,可以使用枚舉類型。枚舉類型是使用 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彈出一個包含可接受值的列表框,減少了按鍵次數,並能夠讓我們回憶起可能的值

枚舉實例

  聲明:

public enum TimeOfDay
{
Moning = 0,
Afternoon = 1,
Evening = 2,
};
  使用:


public string 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;

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

return list[time];
}
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved