{
TypeNone = 0x0,
TypeColor = 0x1,
TypeInfrared = 0x2,
TypeDepth = 0x8,
TypeBodyIndex = 0x10,
TypeBody = 0x20,
TypeAudio = 0x40
}
枚举是一套其基础类型为任何整数类型的已命名常数。 如果显式声明基础类型, Int32 使用。 Enum 是.NET Framework 中的所有枚举的基类。 枚举类型由定义 enum 关键字在 C# 和 Enum...End Enum 在 Visual Basic 中构造。
Enum 提供用于比较此类的实例、 实例的值转换为其字符串表示形式、 将数字的字符串表示形式转换为此类的实例和创建实例的指定的枚举和值的方法。
此外可以将枚举视为位字段。
编程语言通常提供语法来声明枚举,其中包含已命名的常数及其值的组。 下面的示例演示使用 C# 和 Visual Basic 来定义枚举的语法。 它将创建一个名为的枚举 ArrivalStatus 有三个成员︰ ArrivalStatus.Early, ,ArrivalStatus.OnTime, ,和ArrivalStatus.Late。 请注意,在这两种情况下,枚举不显式继承 Enum; 由编译器隐式处理继承关系。
警告 |
---|
决不要创建其基础类型为非整数枚举类型或 Char。 虽然可以通过使用反射来创建此类枚举类型,使用生成的类型的方法调用是不可靠的也可能会引发其他异常。 |
就像任何其他值类型实例化时,您可以实例化枚举类型︰ 通过声明一个变量并为其分配的一个枚举的常量。 下面的示例实例化ArrivalStatus 其值是 ArrivalStatus.OnTime。
您还可以通过以下方式实例化一个枚举值︰
-
通过使用特定编程语言的功能 (如 C#) 强制转换或转换 (如 Visual Basic 中) 的整数值为枚举值。 下面的示例创建ArrivalStatus 对象,其值为 ArrivalStatus.Early 以这种方式。
-
通过调用 Parse 或 TryParse<TEnum> 方法来分析包含枚举中常数的名称的字符串。 有关详细信息,请参阅 分析枚举值部分。
我们建议在定义枚举类型时使用下列最佳方案︰
-
如果尚未定义枚举成员,其值为 0,请考虑创建 None 枚举的常数。 默认情况下,用于枚举的内存初始化为零的公共语言运行时。 因此,如果未定义其值为零的常数,该枚举时将包含非法值时创建它。
-
如果没有明显默认情况下,您的应用程序具有表示,请考虑使用枚举常量值为零表示它。 如果没有任何默认情况下,请考虑使用由任何其他枚举常量其值为零,以指定不是所表示的大小写的枚举的常量。
-
不要指定保留供将来使用的枚举的常量。
-
当您定义的方法或属性,它采用枚举的常量作为一个值时,请考虑验证值。 原因是,即使该数值未定义的枚举中,您可以强制转换为枚举类型的数字值。
中列出了其常量是位域的枚举类型的其他最佳实践 非排他成员和标志特性 部分
创建一个枚举时,不能定义新的方法。 但是,枚举类型继承了一组完整的静态和实例方法从 Enum 类。 以下各节调查这些方法,除了使用枚举值时通常使用的其他几种方法中的大多数。
可以使用强制转换 (在 C# 中) 或 (在 Visual Basic 中) 的转换运算符的枚举成员和其基础类型之间进行转换。 下面的示例使用强制转换或转换运算符来执行转换,同时从一个枚举值到整数和枚举值到整数。
将整数转换为枚举值,时,可以将分配一个值,不是实际的枚举成员。 若要避免此情形,您可以将传递到整数 IsDefined 方法,然后才能执行转换。 下面的示例使用此方法以确定一个整数值数组中的元素是否可以转换为 ArrivalStatus 值。
尽管 Enum 类提供的显式接口实现 IConvertible 接口用于从一个枚举值转换为整数类型,您应使用的方法 Convert 类,如ToInt32, ,以执行这些转换。 下面的示例演示如何使用 GetUnderlyingType 方法以及 Convert.ChangeType 方法将枚举值转换为其基础类型。 请注意,此示例不要求在要在编译时已知的枚举的基础类型。
Parse 和 TryParse<TEnum> 方法允许您将一个枚举值的字符串表示转换成该值。 名称或枚举常量的基础值,可以是字符串表示形式。 注意︰ 分析方法成功转换不是特定枚举的成员,如果字符串可以转换为枚举的基础类型的值的数字字符串表示形式。若要避免此情形, IsDefined 可以调用方法来确保分析方法的结果是有效的枚举值。 该示例阐释了这种方法,并演示对同时调用 Parse(Type, String) 和 Enum.TryParse<TEnum>(String, TEnum) 方法。 请注意,非泛型分析方法返回一个对象,你可能需要强制转换 (在 C#) 或 (在 Visual Basic 中) 转换为相应的枚举类型。
Enum 类型未实现 IEnumerable 或 IEnumerable<T> 接口,从而使你能通过使用循环集合的成员 foreach (在 C# 中) 或 For Each (在 Visual Basic 中) 构造。 但是,您可以枚举中两种方式之一的成员。
枚举的一个常见用途是表示一组互斥的值。 例如, ArrivalStatus 实例可以具有的值 Early, ,OnTime, ,或 Late。 没有意义的值的 ArrivalStatus 实例以反映多个枚举常量。
但是,在其他情况下,枚举对象的值可以包含多个枚举成员,并且每个成员表示中的枚举值的位域。 FlagsAttribute 属性可以用于指示的位域构成的枚举。 例如,名为枚举 Pets 可能用于指示家庭宠物的种类。 可以如下所示定义它
应使用下列最佳方案,定义按位时枚举并应用 FlagsAttribute 属性。
-
使用 FlagsAttribute 自定义特性的枚举才是对数字值执行按位运算 (AND、 OR、 排除或)。
-
在 2 的幂,即 1、 2、 4、 8、 等中定义枚举常量。 这意味着不重叠中组合的枚举常量的各个标志。
-
请考虑创建常用的标志组合一个枚举的常量。 例如,如果您有用于文件 I/O 操作的枚举包含枚举的常量 Read = 1 和Write = 2, ,请考虑创建枚举的常数 ReadWrite = Read OR Write, ,它结合 Read 和 Write 标志。 此外,用于组合标志的按位或操作可能被视为一种高级的概念,在某些情况下,不应为简单任务必需的。
-
如果定义为负的数字为标志枚举常量因为很多标志位置可能会设置为 1,这可能会使代码更令人困惑并鼓励编码错误,请务必小心。
-
若要测试是否在数值中设置一个标志种简便方式是调用实例 HasFlag 方法,如下面的示例中所示。
使用 None 用作枚举其值为零的常数的标志的名称。 不能使用 None 按位运算中,若要测试一个标志,因为结果始终为零的枚举的常数。 但是,您可以执行的逻辑不之间的数字值的按位、 比较和 None 枚举的常量,以确定是否已设置任何位中的数字值。 下面的示例阐释了这一过程。
未定义的枚举值仅为了反映枚举本身的状态。 例如,不定义仅用于标记结束枚举的枚举的常数。 如果您需要确定枚举的最后一个值,请显式检查该值。 此外,可以为第一个和最后一个枚举常量执行范围检查范围内的所有值是否有效。