本文将探讨C#中的枚举实现和使用技巧,至于其他语言的用法,读者可以自行探究。
本文会捎带提一下枚举的基础用法,后面重点讲枚举和位运算相关的内容。
C# 的枚举(Enum)类型是用于声明一组命名常量的基本数据类型(int类型) ,声明格式如下
enum
其中enum_name 指定枚举的类型名称; enumeration list 是一个用逗号分隔的标识符列表。枚举列表中的每个符号代表一个整数值。未显示赋值的情况下,第一个枚举符号的值是0,没有显示赋值的一项为前一项的值+1。如:
enum MyEnum
{
Error,
Head = 2,
Hand, //value == 3
Foot, //value == 4
}
枚举类型转换为int类型:
int value = (int)myEnum;
int类型转换为枚举类型:
MyEnum myEnum = (MyEnum)2;
枚举类型转换为string类型:
string temp = myEnum.toString();
string类型转换为枚举类型:
MyEnum myEnum = Enum.Parse(typeof(MyEnum), "Foot");
对枚举进行遍历可以通过方法Enum.GetNames(Type)获取到所有项的名称数组,也可以通过Enum.GetValues(Type)获取到值的Array列表,然后进行遍历:
foreach (MyEnum value in Enum.GetValues(typeof(MyEnum)))
{
//此处省略一万行
}
小重点:枚举的第一项设置为ERROR是一个好习惯,可以让你在debug过程中很快的发现枚举未赋值的问题,详细论述参见《代码大全》。
提示:如果你是一个不懂位运算的小小鸟,那先去把位运算的基本内容掌握。
拿一个自己项目中实际用到的例子来一起看以下。
在对buff效果的目标类型进行设置时,可以配置的类型包括
自己,团队成员,团队内随机,选择的敌人,敌方团队所有人员,敌方团队随机人员,自己和选择的敌人,战场上的所有人员,随机战场上的部分人员,等等类型
这时候我们程序中的枚举应该怎么实现才能方便我们之后处理对应的逻辑呢?枚举的类型中是不是要设置所有的可能呢?不是的。最好的方式,只需要四个有效值,和一个Error=0。
public enum AffectTargetType
{
Error = 0,
///
/// 己方人员,与Enemy最少有一个成立
///
Self = 0b_0001,
///
/// 敌方人员,与self最少有一个成立
///
Enemy = 0b_0010,
///
/// 团队Tag,不能单独使用
///
Team = 0b_0100,
///
/// 随机Tag,不能单独使用,当Team成立时该值有效
///
Range = 0b_1000,
}
这时候,如果在配置表中要设置一个buff的作用人员为战场上的所有人,只需要将其赋值为0b0111(或者7),如果要对战场上的所有人员进行随机选择,则其值为0b1111(或者15)。
当你要判断一个buff的目标是敌方人员还是己方人员时,只需要做如下判断
//判断是己方人员
if((targetTag & ActionTargetType.Self)==ActionTargetType.Self)
//判断是敌方人员
if((targetTag & ActionTargetType.Enemy)==ActionTargetType.Enemy)
这样做的好处是可以大大简化程序之后的判断处理,逻辑变的更为简洁直观。
但是,用二进制值表示枚举值要发挥除位运算的优势,就要判断好应用的场景。如果我们把用二进制表示的枚举值,一个单一位有效的值位一个元,那么位运算最多只能支持32个元。如果可能存在的单一特征个数超过了32个,那么就不能使用该方式了。比如,表示我国的34个省级行政区划,虽然这个场景的特征很适合使用二进制表示,但是,因为数量上的超出,导致该场景不能使用二进制设置。