.NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天;还有就是用来表示多种复合的状态。这个时候一般需要为枚举加上[Flags]特性标记为位域,例如:
enum WeekDays
{
// 注意: 这里不要将Sunday设置为0x0,至于为什么留给大家思考
Monday = 0x1,
Tuesday = 0x2,
Wednesday = 0x4,
Thursday = 0x8,
Friday = 0x10,
Saturday = 0x20,
Sunday = 0x40
}
这样我们就可以用"或"运算符组合多个状态,例如
static void TestEnumFlags()
{
/* ***********Kingmoon Lab 之 enum flags 语法******************** */
/* 用'|'将各个枚举值分开即可 */
WeekDays wds = WeekDays.Monday | WeekDays.Sunday | WeekDays.Tuesday;
Console.WriteLine( " 我这3天要来大姨妈: "+wds);
/* 我们来看看计算过程:
* 或运算:
0000 0001 --星期一 0x1
或 0100 0000 --星期六 0x20
或 0000 0010 --星期二 0x2
= 0100 0011 = 67
*换句话说: 某个位是1就代表了这个位上的值在枚举中存在 */
Console.WriteLine( " 这3天组合Int为: "+( int)wds);
/* 利用上面规则来判断枚举值中是否包含某个枚举值就轻而易举 */
if ((wds & WeekDays.Monday) != 0)
Console.WriteLine( " 星期一是其中一天 ");
if ((wds & WeekDays.Saturday) == 0)
Console.WriteLine( " 星期六不是其中一天 ");
//(补充) 如果将某个值去掉的话可以按照原来采用这次方式
/* 将星期一从枚举变量中去掉
* 0100 0011
* &1011 1111 (~WeekDays.Monday)取反
* =0000 0011 这样就把星期一去掉啦!
*/ wds = wds & (~WeekDays.Monday);
Console.WriteLine( " 去掉星期一后的效果: "+wds);
}