枚举是程序中常常应用的数据类型,应用枚举,能够让代码具备更高的可读性,易扩展性以及更容易编写等有点。同时枚举还是强类型,晋升程序的健壮性。

例如要对色彩进行辨别,在不应用枚举时,可能制订约定:定义若干个值: 0,1,2,3别离代表红,黄,蓝,绿四种色彩,然而这会减少程序的保护老本。

应用枚举可能很清晰的表明代码的用意
enum Color{    Red,    //红    Yellow, //黄    Blue,   //蓝    Green   //绿}
枚举值的类型

枚举值的类型能够是: byte,sbyte,short,ushort,int,uint,long,ulong。默认类型是int,自定义其它类型的枚举值类型

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);

后果

应用扩大办法向枚举中增加办法
public static Action Set(this Action flags, Action setAction){    return flags | setAction;}//用例var action = Action.Walk;//输入 WalkConsole.WriteLine(action.ToString());action = action.Set(Action.Run);//输入 Walk, RunConsole.WriteLine(action.ToString());
位标记

位标记是一种非凡的枚举类型,枚举值的存在是互斥的,位标记能够了解成是一种组合的列表,如文件的属性能够有暗藏与只读等多种。

位标记的申明

[Flags] //增加Flags标记便可申明一个位标记enum Action{    None = 0,    Walk = 0x0001,    Run = 0x0002,    Speak = 0x0004}
位标记的实例应用
//申明一个行为var action = Action.None;//判断该行为是否能走 输入falseConsole.WriteLine((action & Action.Walk) != 0);Console.WriteLine((action & Action.Walk) == Action.Walk);//增加行走和奔跑行为action = action | Action.Walk | Action.Run;Console.WriteLine((action & Action.Walk) != 0);//trueConsole.WriteLine((action & Action.Run) != 0); //true//删除走的行为action = action &~ Action.Walk;Console.WriteLine((action & Action.Walk) != 0);//falseConsole.WriteLine((action & Action.Run) != 0); //true

应用HasFlag办法判断枚举实例中是否存在某个标记

var action = Action.Run | Action.Speak;Console.WriteLine(action.HasFlag(Action.Walk));//falseConsole.WriteLine(action.HasFlag(Action.Run)); //true

*因为HasFlag承受一个Enum类型的参数,所以应用该办法须要装箱,产生一次内存调配

调用ToString办法能更加直观的看到位标记的组合

var action = Action.Run | Action.Speak; //0x0006//因为存在[Flags],ToString办法便会将它视为一组位标记而不是独自的数值,所以输入 Run, Speak//如果删除[Flags],程序将输入 6Console.WriteLine(action.ToString());
存在位标记时ToString的工作流程
  1. 获取枚举类型定义的数值集并按降序排列
  2. 每个数值将会与枚举实例的值进行“按位与”计算,假如后果等于该数值,与该数值关联的字符串便会追加到输入字符串中,对应的位会被敞开(设置为0)
  3. 反复第2步,直到查看完枚举实例中的所有位