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