枚舉是程序中常常使用的數據類型,使用枚舉,可讓代碼具備更高的可讀性,易擴展性以及更容易編寫等有點。同時枚舉仍是強類型,提高程序的健壯性。ui
例如要對顏色進行區分,在不使用枚舉時,可能制定約定:定義若干個值: 0,1,2,3分別表明紅,黃,藍,綠四種顏色,可是這會增長程序的維護成本。this
enum Color { Red, //紅 Yellow, //黃 Blue, //藍 Green //綠 }
枚舉值的類型能夠是: byte,sbyte,short,ushort,int,uint,long,ulong。默認類型是int,自定義其它類型的枚舉值類型spa
enum Color : byte {} //獲取枚舉值類型(輸出System.Byte) System.Console.WriteLine(System.Enum.GetUnderlyingType(typeof(Color)));
foreach (var item in (Color[])System.Enum.GetValues(typeof(Color))) System.Console.WriteLine(item);
結果
code
public static Action Set(this Action flags, Action setAction) { return flags | setAction; } //用例 var action = Action.Walk; //輸出 Walk Console.WriteLine(action.ToString()); action = action.Set(Action.Run); //輸出 Walk, Run Console.WriteLine(action.ToString());
位標誌是一種特殊的枚舉類型,枚舉值的存在是互斥的,位標誌能夠理解成是一種組合的列表,如文件的屬性能夠有隱藏與只讀等多種。blog
位標誌的聲明內存
[Flags] //添加Flags標記即可聲明一個位標誌 enum Action { None = 0, Walk = 0x0001, Run = 0x0002, Speak = 0x0004 }
//聲明一個行爲 var action = Action.None; //判斷該行爲是否能走 輸出false Console.WriteLine((action & Action.Walk) != 0); Console.WriteLine((action & Action.Walk) == Action.Walk); //添加行走和奔跑行爲 action = action | Action.Walk | Action.Run; Console.WriteLine((action & Action.Walk) != 0);//true Console.WriteLine((action & Action.Run) != 0); //true //刪除走的行爲 action = action &~ Action.Walk; Console.WriteLine((action & Action.Walk) != 0);//false Console.WriteLine((action & Action.Run) != 0); //true
使用HasFlag方法判斷枚舉實例中是否存在某個標誌字符串
var action = Action.Run | Action.Speak; Console.WriteLine(action.HasFlag(Action.Walk));//false Console.WriteLine(action.HasFlag(Action.Run)); //true
*因爲HasFlag接受一個Enum類型的參數,因此使用該方法須要裝箱,產生一次內存分配工作流
調用ToString方法能更加直觀的看到位標誌的組合it
var action = Action.Run | Action.Speak; //0x0006 //因爲存在[Flags],ToString方法便會將它視爲一組位標誌而不是單獨的數值,因此輸出 Run, Speak //若是刪除[Flags],程序將輸出 6 Console.WriteLine(action.ToString());