枚举是程序中常常使用的数据类型,使用枚举,可让代码具备更高的可读性,易扩展性以及更容易编写等有点。同时枚举仍是强类型,提高程序的健壮性。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());