开发者经常要在代码中处理枚举数据类型——这些代码可能是自己编写的也可能是别人的。下面是在实际的应用程序中枚举类型的用法:
- 多选一(one-of-all)枚举类型:这种类型的变量每次只能取列举出的若干种可能值中的一种,如“DaysOfTheWeek( 星期几)”枚举,这种类型的变量不能同时取值为星期一和星期二。
- 标志(flag-like)枚举类型:它们通常为整型(int)。其中某些位(bit)是信息位,其它的位可以忽略。标志位所保存的信息为标志,你可以把它们分别置位(赋值为1)或者复位(赋值为0)。开发者通常用这种枚举类型来获得或者标示设备、资源等的状态。文件的属性就是这种枚举类型的一个例子,它是一系列属性的组合,包括归档、隐藏、正常和只读。
- 标志和多选一混合枚举类型:它们是上面提到的两种枚举类型的混合。有些位保留为标志位,其它位解释为多选一枚举。让我们以VARIANT为例。你可以保留为VT_I1 (字节), VT_I2 (短整型)、VT_BSTR
(BSTR)等类型,也可以保留为 VT_ARRAY | VT_I1 (字节数组)、 VT_ARRAY | VT_BYREF |
VT_I4(一种整型数组,由参数传递)等。
使用标志类型和混合类型枚举的问题是:当你调试程序时,你读取并理解这两种枚举类型变量的值是一件困难的事。例如,当处理变量时,VT_ARRAY | VT_I4的值为8195,你必须把这个值转化为十六进制数,然后才能最终看到它每一位表示的意思。这就显得特别麻烦。
解决这个问题的一个好方法就是使用字符串枚举(String Enum),这样当你调试枚举变量的值时,你可以看到它对应的字符串(如,对VT_ARRAY |
VT_I4来说,你可以看到“数组|整型”)。另外,在发行模式(Release mode)下你的代码效率和使用(普通)枚举的效率一样高。
我们可以把枚举值与字符串建立对应关系来解决本文第一部分提出的问题。对应关系由一个或两个数组组成(你至少要保留一个):
下面是一个例子: