不忘本~枚舉
嗨!又(you)要(yao)和大家一(yi)起說說不忘本的(de)文章了,其(qi)實(shi)我寫(xie)的(de)不忘本就是指(zhi)定C#的(de)一(yi)些基礎知識,把基礎知識從(cong)書(shu)面上拿出(chu)來,放到實(shi)踐中去(qu)講(jiang)!咱領袖說的(de)好(hao):理論要(yao)聯(lian)系實(shi)際嗎!哈(ha)哈(ha)!
先看一(yi)個最簡單的(de)枚舉enum吧
1 public enum UserBaseColumns 2 3 { 4 5 UserName = 1, 6 7 Age = 2, 8 9 }
我們如(ru)何去使(shi)用它呢(ni),很簡單,如(ru)果我們希望(wang)拿到UserBaseColumns.UserName這個枚舉(ju)元素(su)的值(zhi),可以(yi)這樣(yang)寫(int)UserBaseColumns.UserName,也就(jiu)是(shi)強轉(zhuan)換一下就(jiu)OK了,因為枚舉(ju)和數值(zhi)類型可以(yi)直(zhi)接轉(zhuan)換的,如(ru)果希望(wang)得(de)到UserName這個字(zi)符呢(ni),即(ji)枚舉(ju)元素(su)的名(ming)稱,我們可以(yi)這樣(yang):
Enum.GetName(UserBaseColumns.UserName.GetType(), UserBaseColumns.UserName)
其實為(wei)什么要(yao)使用(yong)(yong)枚(mei)舉(ju)(ju)呢?這(zhe)(zhe)個問題(ti)是(shi)比它(ta)的(de)基礎知識(shi)更重要(yao)的(de),枚(mei)舉(ju)(ju)對(dui)于(yu)程(cheng)序(xu)員來說是(shi)提高了(le)(le)程(cheng)序(xu)的(de)可讀性(xing),對(dui)于(yu)使用(yong)(yong)程(cheng)序(xu)的(de)用(yong)(yong)戶來說,沒有任何意(yi)義;我(wo)們(men)通常(chang)把(ba)一(yi)些具有固(gu)定值的(de)對(dui)象創建為(wei)枚(mei)舉(ju)(ju)對(dui)象,把(ba)一(yi)些經常(chang)發(fa)生變(bian)化的(de)存儲在(zai)數(shu)據表中,這(zhe)(zhe)也是(shi)程(cheng)序(xu)設計(ji)的(de)一(yi)個常(chang)識(shi),例如,一(yi)個用(yong)(yong)戶對(dui)象,它(ta)有一(yi)個狀態(tai)字(zi)段,而這(zhe)(zhe)個字(zi)段只有"正常(chang)","刪除","禁用(yong)(yong)"這(zhe)(zhe)三種值,那我(wo)們(men)為(wei)了(le)(le)使用(yong)(yong)程(cheng)序(xu)員在(zai)給對(dui)象賦值時的(de)可讀性(xing)強,就把(ba)這(zhe)(zhe)個字(zi)段設為(wei)枚(mei)舉(ju)(ju)枚(mei)舉(ju)(ju)類型,看代碼:
1 public enum Status 2 3 { 4 5 /// <summary> 6 7 /// 正常 8 9 /// </summary> 10 11 Normal = 100, 12 13 /// <summary> 14 15 /// 刪除(chu) 16 17 /// </summary> 18 19 Deleted = 400, 20 21 /// <summary> 22 23 /// 禁用 24 25 /// </summary> 26 27 Blocked = 500, 28 29 }
而用戶對象就變成了
1 /// <summary> 2 3 /// 用戶(hu)實體 4 5 /// </summary> 6 7 public partial class UserBase : IDataEntity 8 9 { 10 11 /// <summary> 12 13 /// 用戶(hu)名 14 15 /// </summary> 16 17 public string UserName { get; set; } 18 19 /// <summary> 20 21 /// 年(nian)齡(ling) 22 23 /// </summary> 24 25 public int Age { get; set; } 26 27 /// <summary> 28 29 /// 狀態 30 31 /// </summary> 32 33 public Status Status { get; set; } 34 35 }
以上是枚舉(ju)在(zai)程序開發中最基(ji)礎的用法,現在(zai)我再來說說枚舉(ju)的一(yi)些高級用法,枚舉(ju)對象(xiang)支持位運算,即它支持,加(jia),減(jian)運算.
1 [Flags] 2 3 public enum UserBaseColumns 4 5 { 6 7 UserName = 1, 8 9 Age = 2, 10 11 }
這是加運算
1 UserBaseColumns enums = new UserBaseColumns(); 2 3 enums = UserBaseColumns.UserName | UserBaseColumns.Age;
1 enums = UserBaseColumns.UserName ^ (~UserBaseColumns.Age);
這是查看元素是否在枚舉合的操作
1 if ((enums & UserBaseColumns.UserName) != 0) 2 3 Console.WriteLine("包(bao)括名字(zi)字(zi)段(duan)"); 4 5 else 6 7 Console.WriteLine("不包括名(ming)字字段");
在(zai)C#4.0中已經集成了判斷元素(su)是否在(zai)集合的方法:HasFlag
當然我們(men)不提倡用4.0中的方法,因為(wei)如(ru)果你的frameworks是(shi)較低的版本時,這(zhe)個(ge)HasFlag就報錯了,
別外,還有(you)一種將枚(mei)舉轉為字符,再去比較它是否存在于集(ji)合的方法(fa),下面我(wo)給(gei)出代碼:
1 /// <summary> 2 3 /// 自定(ding)義枚(mei)舉(ju)指是(shi)否(fou)在枚(mei)舉(ju)列表中 4 5 /// </summary> 6 7 public class HasEnum 8 9 { 10 11 private string[] EnumArray = null; 12 13 public HasEnum(Enum enums) 14 15 { 16 17 this.EnumArray = Regex.Split(enums.ToString(), ","); 18 19 if (this.EnumArray.Length < 1) 20 21 throw new Exception("輸入參(can)數異常"); 22 23 } 24 25 public bool HasEnumFlags(Enum entity) 26 27 { 28 29 return EnumArray.Contains(Enum.GetName(entity.GetType(), entity)); 30 31 } 32 33 }
好了,講到這里,大家回去做個(ge)demo,自己實驗一下(xia)吧!如果有疑問,請給我留言!
為了所(suo)有enum對象(xiang)都是繼(ji)承為Enum這(zhe)(zhe)個抽(chou)象(xiang)類的.它是所(suo)有枚舉對象(xiang)的基類,所(suo)以在程序中(zhong)我們經(jing)常這(zhe)(zhe)樣寫
1 /// <summary> 2 3 /// 更(geng)新指定字段 4 5 /// </summary> 6 7 /// <param name="entity"></param> 8 9 /// <param name="enums"></param> 10 11 void Update(IDataEntity entity, Enum enums);
上面的編程風格叫做面向接口編程,也叫面向超類編程!在這個例子中Enum就是微軟給我們定義的超類
我們定義的所有枚舉很派生自它.
返回目錄