关于c#:枚举和位标志

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

例如要对色彩进行辨别,在不应用枚举时,可能制订约定:定义若干个值: 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步,直到查看完枚举实例中的所有位

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据