13. 枚举

来源:互联网 发布:光翼学园网络班有用吗 编辑:程序博客网 时间:2024/06/18 14:05

13.1 枚举

枚举是由程序员定义的类型,与类和结构一样。

  • 与结构一样,枚举是值类型,因此直接存储它们的数据,而不是分开存储成引用和数据。
  • 枚举只有一种类型的成员:命名的整数值常量。
定义:
enum TrafficLight
{

Green,  //逗号分隔,没有分号
Yellow, //转换成int
Red

}


每个枚举都有一个底层整数类型,默认为int。

  • 每个枚举成员被赋值一个底层类型的常量值。
  • 编译器把第一个成员赋值为0,并对每一个后续成员赋的值比前一个成员多1。

可以把枚举值赋给枚举类型变量,可以把成员字面量赋给变量,或从另一个相同类型的变量复制值。


设置底层类型和显式值

可以通过把冒号和类型名放在枚举名之后以使用int以外的整数类型。类型可以是除了char以外的任何整数类型。所有成员常量都属于枚举的底层类型。

成员常量的值可以是底层类型的任何值。要显式地设置一个成员的值,在枚举声明中的变量名之后使用初始化表达式。尽管不能有重复的名称,但可以有重复的值。


隐式成员编号

可以显式地赋值给任何成员常量。如果不初始化一个成员常量,编译器隐匿地给它赋一个值。

关联到成员名称的值不需要是独特的。

成员赋值的法则


13.2 位标志

程序员长期使用单字(single world)的不同位作为表示一组开/关标志的紧凑方法。枚举提供了实现它的简便方法。

一般的步骤如下:

  1. 确定需要多少个位标志,并选择一种有足够多位的无符号类型来保持它。
  2. 确定每个比特位置代表什么,并给它们一个名称。声明一个选中的整数类型的枚举,每个成员由一个比较位置表示。
  3. 使用按位或(OR)运算符设置保持该位标志的字中的适当的位。
  4. 使位与(AND)运算符解开位标志。
Flags特性

特性看起来是放在类声明的上面一行的在方括号之间的字符串。特性根本不能改变计算。但是,它提供几个便利特征。

第一,它通知编译器、对象浏览器和其他观察这段代码的工具该枚举的成员将要被结合为位标志,而不是只作为分开的值使用。这使浏览器更合适地解释该枚举类型的变量。
第二,它允许一个枚举的ToString方法,以对位标志的值提供更合适的格式化。ToString方法接受一个枚举值并把它和枚举的常量成员的值做比较。如果它匹配了其中的一个成员,ToString返回该成员的字符串名称。



13.3 关于枚举的补充

枚举只有单一的成员类型:声明的成员常量。

  • 不能对成员使用修饰符。它们都隐式地具有和枚举相同的访问性。
  • 由于成员是常量,即使在没有该枚举类型的变量时它也可以访问。使用枚举类型名,跟着一个点和成员名。
枚举是一个独特的类型。比较不同枚举类型的成员会导致一个编译期错误。

0 0
原创粉丝点击