枚舉是用戶定義的整數類型。在聲明一個枚舉時,要指定該枚舉的示例可以包含的一組可接受的值。還可以給值指定易於記憶的名稱。個人理解就是為一組整數值賦予意義。
2.1:枚舉可以使代碼更易於維護,有助於確保給變量指定合法的、期望的值。
2.2:枚舉可以使代碼清晰,用描述性的名稱來表示整數值,增加代碼可讀性。
/// <summary>
/// 聲明一個枚舉,審核狀態
/// </summary>
public enum AduitStatus
{
草稿 = 0,
待審核 = 1,
審核通過 = 2,
審核退回 = 3
}
public static void AuditResource(AduitStatus aduitStatus)
{
switch (aduitStatus)
{
case AduitStatus.審核通過:
//審核通過的操作,比如修改數據庫中該記錄的狀態等等
Console.WriteLine("審核通過!");
break;
case AduitStatus.審核退回:
//審核退回操作
Console.WriteLine("已退回!");
break;
default:
Console.WriteLine("hello");
break;
}
}
4.1個人理解枚舉是用來存儲一組不會輕易改變的值,比如性別:未知、男、女。審核狀態:草稿、審核通過、審核退回等。
4.2拿審核狀態來說,數據庫中一般存儲各個狀態的值。而界面顯示的時候需要展示狀態的名稱,比如用0表示草稿、1表示審核通過、2表示審核退回。如果不用枚舉當然也可以實現比如:
public static void AuditResource(int aduitStatus)
{
switch (aduitStatus)
{
case 1:
//審核通過的操作,比如修改數據庫中該記錄的狀態等等
Console.WriteLine("審核通過!");
break;
case 2:
//審核退回操作
Console.WriteLine("已退回!");
break;
default:
Console.WriteLine("hello");
break;
}
}
而顯示的時候根據取到的值,再用代碼值替換成描述性名稱。
foreach (Article article in list)
{
string ArticleStatus = "";
if (article.Status == 0)
{
ArticleStatus = "草稿";
}
else if (article.Status == 1)
{
ArticleStatus = "審核通過";
}
else if (article.Status == 2)
{
ArticleStatus = "審核退回";
}
//……
}
上面這種硬編碼就明顯存在著很多缺點,如其他人單獨看上面一段代碼,可能不明白每個數字的含義,就算是自己時間久了之後也未必能夠記住每個值的含義,再閱讀到這邊代碼的時候就難以理解,而且顯示的名稱沒有個標准,不同的人描述不同狀態有自己的叫法。
像上面這種用到Switch的情況,很多時候都可以用枚舉實現。比如下面的代碼,swicth語句中的值用枚舉實現,而顯示一個類中的狀態名稱時候根據這個值轉換為枚舉裡面的名稱。這樣代碼更容易理解,顯示也會統一。
class Program
{
/// <summary>
/// 聲明一個枚舉,審核狀態
/// </summary>
public enum AduitStatus
{
草稿 = 0,
審核通過 = 1,
審核退回 = 2
}
public class Artice
{
public string Title { get; set; }
public int status { get; set; }
}
static void Main(string[] args)
{
Console.WriteLine("該資源審核是否通過?(Y/N)");
string isPass = Convert.ToString(Console.ReadLine());
if (isPass.ToUpper() == "Y")
{
AuditResource(AduitStatus.審核通過);
}
else
{
AuditResource(AduitStatus.審核退回);
}
Artice Ar = new Artice() { Title = "C#學習筆記", status = 0 };
Console.WriteLine("標題:{0},狀態:{1}", Ar.Title, (AduitStatus)(Ar.status));//輸出“標題:C#學習筆記,狀態:草稿”
Console.ReadKey();
}
public static void AuditResource(AduitStatus aduitStatus)
{
switch (aduitStatus)
{
case AduitStatus.審核通過:
//審核通過的操作,比如修改數據庫中該記錄的狀態等
Console.WriteLine(AduitStatus.審核通過);
break;
case AduitStatus.審核退回:
//審核退回操作
Console.WriteLine(AduitStatus.審核退回);
break;
default:
Console.WriteLine("hello");
break;
}
}
}
允許結果

4.3再比如性別,前端可能用單項選擇框來實現,當然可以在頁面上把男、女選項列出來,並寫死每個項的值,其缺點和上面類似,這種情況下也可以考慮用枚舉來定義。
比如城市重點項目類型:基礎設施類項目,產業類項目,制造業項目,可能今年是這些第二年又會增加一些項目類型,如服務業項目。像這種一組值雖然也可以用枚舉來做,但是第二年增加新項目類型的時候需要去調整代碼,而這屬於一開始就知道可能改變的,是正常增加,不應該去調整程序代碼。像這種一組容易變化的值,一般使用數據字典表來存儲,可以動態去配置這些代碼項。
數據字典表一般使用一張主表和一張子表,主表存儲整個系統中所有的可配置項名稱如:圖書類別,重大項目類型。子表存儲該類的值別具體的名稱、值、排序、層級等等,而其他具體有用到這些代碼值的表,和這兩種表關聯處理。總之對於不確定的一組有含義的值最好使用可配置的方式維護,不會輕易改變的一組有含義的值可以用枚舉實現。