如果,你有这样下面一个工作状态,你想让一个角色拥有多个工作状态,你会如何进行处理?是定义一个List去存储这些状态,然后一个个的去遍历判断?不用那么复杂,你可以使用这个:枚举标志[Flags]
public enum WorkTags
{
None,
Violent,
Caring,
Social
}
那什么是枚举标志呢?
枚举由位字段组成。通过这样做,我们可以使用按位运算来组合值或检查保存组合的变量中是否存在其中一个值。要使用该Flags属性,我们必须声明我们的枚举,且每个值用二进制来表示:
[Flags]
public enum WorkTags
{
None = 0,
Violent= 1,
Caring= 2,
Social= 4
}
/********或者********/
[Flags]
public enum WorkTags
{
None = 0,
Violent= 0x1,
Caring= 0x2,
Social= 0x3
}
/********或者********/
[Flags]
public enum WorkTags
{
None = 0,
Violent= 1 << 0,
Caring= 1 << 1,
Social= 1 << 2,
}
那如何使用呢?
我们可以使用按位或运算符 () 在现有变量中添加一个值
workStatus=WorkTags.Violent;
workStaus=WorkTags.Violent | WorkTags.Caring;
/********或者********/
workStatus=WorkTags.Violent;
workStaus|= WorkTags.Caring;
// 这是表示当前有两个状态,可以使用暴力行为和治疗
那么如何删掉一个值呢?
workStaus=WorkTags.Violent | WorkTags.Caring;
workStaus=WorkTags.Violent &~ WorkTags.Caring;
/********或者********/
workStaus=WorkTags.Violent | WorkTags.Caring;
workStaus &= ~WorkTags.Caring;
// // 这是表示初始有两个状态,暴力行为和治疗,然后我们删除了一个治疗状态
最后,如何判断是否包含某个状态呢?
(workStaus & WorkTags.Caring) == WorkTags.Caring;
/********或者********/
workStaus.HasFlag(WorkTags.Caring);
但是有一点需要注意,如果想检测状态None,上面的两种方式都会返回true,所以我们需要换一种方式来判断
workStaus.Equals(WorkTags.None);