14.4 使用标志枚举
前面我们介绍的是简单枚举,如Week。简单枚举的值不用于组合也不用于按位比较。但在某些情况下,需要对枚举的各个成员进行组合,假如要定义一个枚举,它的每个成员表示一种状态,用以表示一个普通的三键鼠标哪些键被按下,根据排列组合,有多少种可能呢?左键、中键、右键、左右键、左中键、右中键,不算什么键也不按的情况,一共6种,那就意味着枚举有6个成员。这还只是3个元素的组合,如果是4个、5个甚至更多的元素组合呢?那就意味着需要更多的枚举成员来描述各种情况!显然,这时候使用简单枚举就不太现实,虽然简单枚举能解决一部分问题,但也不能应付更复杂的情况,何况这种解决方案也不是最优的。这时候使用标志枚举就可以轻松应对了。如何做呢?要定义一个标志枚举,需要注意如下两点:
❑使用Flag特性(System.FlagsAttribute类)修饰,关于特性会在第24章进行讲解,这里只需要知道特性主要是对它所修饰的元素起一个描述、说明作用即可;
❑枚举各成员的值应以2的幂进行赋值,例如:1、2、4、8、16、32……2n。现在我们声明一个标志枚举来解决前文所述的问题,如代码清单14-8所示。
代码清单14-8 标志枚举示例
[System.Flags]//特性
public enum MouseButtons
{
}
下一步讨论如何描述前文所述的6种情况。这里以同时按下左中右三键为例进行说明,如代码清单14-9所示。
代码清单14-9 设置同时按左中右三键
1 class EnumSample
2{
3 public static void Main()
4{
18}
上述代码运行结果为:
按下鼠标的键:Left,Right,Middle
左键被按下了。
表14-1是对代码清单14-9的说明。
图14-2说明了创建一个标志字然后检查某个特定标志位是否被设置的过程。
图 14-2 标志枚举成员的组合和判断