关于c#:枚举和位标志

7次阅读

共计 1836 个字符,预计需要花费 5 分钟才能阅读完成。

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

例如要对色彩进行辨别,在不应用枚举时,可能制订约定:定义若干个值: 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;
// 输入 Walk
Console.WriteLine(action.ToString());
action = action.Set(Action.Run);
// 输入 Walk, Run
Console.WriteLine(action.ToString());
位标记

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

位标记的申明

[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 办法能更加直观的看到位标记的组合

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