System.Enum 类

方法描述

为枚举提供基类。

语法定义(C# System.Enum 类 的用法)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Enum : ValueType, 
	IComparable, IFormattable, IConvertible

构造函数

构造函数名称 构造函数描述
Enum 初始化 Enum 类的新实例。

成员/方法

方法名称 方法描述
CompareTo 将此实例与指定对象进行比较并返回一个对二者的相对值的指示。
Equals 返回一个值,该值指示此实例是否与指定的对象相等。 (重写 ValueType.Equals(Object)。)
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
Format 根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式。
GetHashCode 返回该实例的值的哈希代码。 (重写 ValueType.GetHashCode()。)
GetName 在指定枚举中检索具有指定值的常数的名称。
GetNames 检索指定枚举中常数名称的数组。
GetType 获取当前实例的 Type。 (继承自 Object。)
GetTypeCode 返回此实例的基础 TypeCode。
GetUnderlyingType 返回指定枚举的基础类型。
GetValues 检索指定枚举中常数值的数组。
HasFlag 确定当前实例中是否设置了一个或多个位域。
IsDefined 返回指定枚举中是否存在具有指定值的常数的指示。
MemberwiseClone 创建当前 Object 的浅表副本。 (继承自 Object。)
Parse(Type, String) 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。
Parse(Type, String, Boolean) 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否区分大小写。
ToObject(Type, Byte) 将指定的 8 位无符号整数转换为枚举成员。
ToObject(Type, Int16) 将指定的 16 位有符号整数转换为枚举成员。
ToObject(Type, Int32) 将指定的 32 位有符号整数转换为枚举成员。
ToObject(Type, Int64) 将指定的 64 位有符号整数转换为枚举成员。
ToObject(Type, Object) 将具有整数值的指定对象转换为枚举成员。
ToObject(Type, SByte) 将指定的 8 位有符号整数值转换为枚举成员。
ToObject(Type, UInt16) 将指定的 16 位无符号整数值转换为枚举成员。
ToObject(Type, UInt32) 将指定的 32 位无符号整数值转换为枚举成员。
ToObject(Type, UInt64) 将指定的 64 位无符号整数值转换为枚举成员。
ToString() 将此实例的值转换为其等效的字符串表示形式。 (重写 ValueType.ToString()。)
ToString(IFormatProvider) 已过时。此方法重载已过时;请使用 Enum.ToString()。
ToString(String) 使用指定格式将此实例的值转换成其等效的字符串表示。
ToString(String, IFormatProvider) 已过时。此方法重载已过时;请使用 Enum.ToString(String)。
TryParse(String, TEnum) 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值。
TryParse(String, Boolean, TEnum) 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否区分大小写。 用于指示转换是否成功的返回值。

提示和注释

枚举是一个指定的常数集,其基础类型可以是除 Char 外的任何整型。 如果没有显式声明基础类型,则使用 Int32。 Enum 是 .NET Framework 中所有枚举的基类。

Enum 提供比较此类的实例的方法、将实例的值转换为其字符串表示形式的方法、将数字的字符串表示形式转换为此类的实例的方法和创建指定枚举和值的实例的方法。

也可以将枚举视为位域。 更多信息,请参见 非独占成员和标志特性 部分和 FlagsAttribute 主题。

创建枚举类型。

编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举。 下面的示例演示了通过 C# 和 Visual Basic 定义枚举的语法。 它创建名为 ArrivalStatus 的枚举,该枚举有三个成员:ArrivalStatus.Early、ArrivalStatus.OnTime 和 ArrivalStatus.Late。 请注意,在这两种情况下,该枚举不是从 Enum 显式继承的,编译器会隐式处理该继承关系。

C#

VB

复制

public enum ArrivalStatus { Late=-1, OnTime=0, Early=1 };

警告

永远不要创建基础类型为非整形的枚举类型。 虽然可以通过使用反射来创建这一枚举类型,但使用得出的类型的方法调用是不可靠的,也可能会引发其他异常。

实例化枚举类型。

可以像实例化任何其他值类型一样实例化一个枚举类型,方法是:声明一个变量并向其分配其中一个枚举常量。 下面的示例实例化值为 ArrivalStatus.OnTime 的 ArrivalStatus。

C#

VB

复制

public class Example

{

public static void Main()

{

ArrivalStatus status = ArrivalStatus.OnTime;

Console.WriteLine("Arrival Status: {0} ({0:D})", status);

}

}

// The example displays the following output:

// Arrival Status: OnTime (0)

还可以采用以下方式实例化枚举值:

通过使用特定编程语言功能来把整数值转换(如在 C# 中)或转换(如在 Visual Basic 中)为枚举值。 下面的示例创建一个ArrivalStatus对象,其值为ArrivalStatus.Early,如下例所示。

C#

VB

复制

ArrivalStatus status2 = (ArrivalStatus) 1;

Console.WriteLine("Arrival Status: {0} ({0:D})", status2);

// The example displays the following output:

// Arrival Status: Early (1)

通过调用它的隐式默认构造函数。 如下示例所示,在这种情况下,枚举实例的基础值为 0。 但是,这不一定是枚举中有效的常数值。

C#

VB

复制

ArrivalStatus status1 = new ArrivalStatus();

Console.WriteLine("Arrival Status: {0} ({0:D})", status1);

// The example displays the following output:

// Arrival Status: OnTime (0)

通过调用 Parse 或 TryParse 方法以分析包含枚举中的常量名称的字符串。 更多信息,请参见 分析枚举值 部分。

通过调用 ToObject 方法以把整数值转换为枚举类型。 更多信息,请参见 执行转换 部分。

枚举最佳做法

建议在定义枚举类型时使用以下最佳做法:

如果未定义值是 0 的枚举成员,则考虑创建 None 枚举的常数。 默认情况下,公共语言运行时会将用于枚举的内存初始化为零。 因此,如果不定义值为零的常量,则枚举在创建时将包含非法值。

如果明显存在应用程序表示的默认情况,请考虑使用值为零的枚举常量表示默认值。 如果不存在默认情况,请考虑使用值为零的枚举常量(这指定该情况不由任何其他枚举常量表示)。

不要指定保留供将来使用的枚举常量。

在定义采用枚举常量作为值的方法或属性时,应考虑对该值进行验证。 原因是即使没有在枚举中定义某个数值,也可以将该数值强制转换为枚举类型。

常数是位域的枚举类型的其他最佳做法已列在非独占成员和标志特性部分。

使用枚举执行操作

不能在创建枚举时定义新方法。 然而,枚举类型从 Enum 类中继承一套完整的静态方法和实例方法。 以下各节除了调查大多数的这些方法,还调查使用枚举值时通常使用的其他几种方法。

执行转换

可通过使用强制转换(在 C# 中)或转换(在 Visual Basic 中)运算符在枚举成员与其基础类型之间进行转换。 下面的示例使用大小写或转换运算符来执行从整数到枚举值和从枚举值到整数的两个转换。

C#

VB

复制

int value3 = 2;

ArrivalStatus status3 = (ArrivalStatus) value3;

int value4 = (int) status3;

Enum 类还包括ToObject方法,将任何整型类型的值转换为枚举值。 下面的示例使用 ToObject 方法将 Int32 转换为 ArrivalStatus 值。 请注意,由于 ToObject 返回 Object 类型的值,使用强制转换或转换操作来将该对象强制转换成枚举类型可能仍然是有必要的。

C#

VB

复制

int number = -1;

ArrivalStatus arrived = (ArrivalStatus) ArrivalStatus.ToObject(typeof(ArrivalStatus), number);

将整数转换为枚举值时,可以分配一个实际并非枚举成员的值。 为防止该情况,可在执行转换前将该整数传递至 IsDefined 方法。 下面的示例使用此方法来确定整数值的数组中的元素是否可以转换 ArrivalStatus 值。

C#

VB

复制

using System;

public enum ArrivalStatus { Unknown=-3, Late=-1, OnTime=0, Early=1 };

public class Example

{

public static void Main()

{

int[] values = { -3, -1, 0, 1, 5, Int32.MaxValue };

foreach (var value in values)

{

ArrivalStatus status;

if (Enum.IsDefined(typeof(ArrivalStatus), value))

status = (ArrivalStatus) value;

else

status = ArrivalStatus.Unknown;

Console.WriteLine("Converted {0:N0} to {1}", value, status);

}

}

}

// The example displays the following output:

// Converted -3 to Unknown

// Converted -1 to Late

// Converted 0 to OnTime

// Converted 1 to Early

// Converted 5 to Unknown

// Converted 2,147,483,647 to Unknown

尽管 Enum 类提供 IConvertible 接口的显式接口实现以从枚举值转换为整数类型,您仍应使用 Convert 类的方法,例如 ToInt32,以执行这些转换。 下面的示例演示了如何使用 GetUnderlyingType 方法以及 Convert.ChangeType 方法将枚举值转换为其基础类型。 请注意,此示例不需要在编译时已知枚举的基础类型。

C#

VB

复制

ArrivalStatus status = ArrivalStatus.Early;

var number = Convert.ChangeType(status, Enum.GetUnderlyingType(typeof(ArrivalStatus)));

Console.WriteLine("Converted {0} to {1}", status, number);

// The example displays the following output:

// Converted Early to 1

分析枚举值

Parse 和 TryParse 方法,可让您将枚举值的字符串表示形式转换为该值。 字符串表示可为名称或枚举常数的底层值。 请注意,如果可以将字符串转换为该枚举的基础类型的值,那么分析方法就能成功地转换数字(非特定枚举的成员)的字符串表示形式。 为防止这一点,可以调用 IsDefined 方法,以确保解析方法的结果是有效的枚举值。 该示例阐释了此方法并演示了 Parse 和 Enum.TryParse(String, TEnum) 方法调用。 请注意,非泛型分析方法返回一个对象,您可能必须将该对象强制转换(在 C# 中)或转换(在 Visual Basic 中)为适当的枚举类型。

C#

VB

复制

string number = "-1";

string name = "Early";

try {

ArrivalStatus status1 = (ArrivalStatus) Enum.Parse(typeof(ArrivalStatus), number);

if (!(Enum.IsDefined(typeof(ArrivalStatus), status1)))

status1 = ArrivalStatus.Unknown;

Console.WriteLine("Converted '{0}' to {1}", number, status1);

}

catch (FormatException) {

Console.WriteLine("Unable to convert '{0}' to an ArrivalStatus value.",

number);

}

ArrivalStatus status2;

if (Enum.TryParse(name, out status2)) {

if (!(Enum.IsDefined(typeof(ArrivalStatus), status2)))

status2 = ArrivalStatus.Unknown;

Console.WriteLine("Converted '{0}' to {1}", name, status2);

}

else {

Console.WriteLine("Unable to convert '{0}' to an ArrivalStatus value.",

number);

}

// The example displays the following output:

// Converted '-1' to Late

// Converted 'Early' to Early

格式化枚举值

可通过调用静态 Format 方法以及重载实例 ToString 方法将枚举值转换为其字符串表示形式。 可使用格式字符串来控制将枚举值表示为字符串所采用的精确方法。 有关更多信息,请参见 枚举格式字符串。 下面的示例使用每个支持的枚举格式字符串将 ArrivalStatus 枚举的成员转换为其字符串表示形式。

C#

VB

复制

string[] formats= { "G", "F", "D", "X"};

ArrivalStatus status = ArrivalStatus.Late;

foreach (var fmt in formats)

Console.WriteLine(status.ToString(fmt));

// The example displays the following output:

// Late

// Late

// -1

// FFFFFFFF

循环访问枚举成员

Enum 类型不实现 IEnumerable 或 IEnumerable 接口,其可使您能够通过使用foreach(采用 C#) 或For Each(采用 Visual Basic)构造迭代集合中的成员。 但是,可以通过两种方式的任意一种设置枚举成员。

可以通过调用 GetNames 方法检索包含枚举成员名称的字符串数组。 接下来,对字符串数组中的每个元素,您可以调用 Parse 方法将该字符串转换为其等效的枚举值。 下面的示例阐释了这种方法。

C#

VB

复制

string[] names = Enum.GetNames(typeof(ArrivalStatus));

Console.WriteLine("Members of {0}:", typeof(ArrivalStatus).Name);

Array.Sort(names);

foreach (var name in names) {

ArrivalStatus status = (ArrivalStatus) Enum.Parse(typeof(ArrivalStatus), name);

Console.WriteLine(" {0} ({0:D})", status);

}

// The example displays the following output:

// Members of ArrivalStatus:

// Early (1)

// Late (-1)

// OnTime (0)

// Unknown (-3)

可以通过调用 GetValues 方法检索枚举中包含基础值的数组。 接下来,对数组中的每个元素,您可以调用 ToObject 方法将该整数转换为其等效的枚举值。 下面的示例阐释了这种方法。

C#

VB

复制

var values = Enum.GetValues(typeof(ArrivalStatus));

Console.WriteLine("Members of {0}:", typeof(ArrivalStatus).Name);

foreach (var value in values) {

ArrivalStatus status = (ArrivalStatus) Enum.ToObject(typeof(ArrivalStatus), value);

Console.WriteLine(" {0} ({0:D})", status);

}

// The example displays the following output:

// Members of ArrivalStatus:

// OnTime (0)

// Early (1)

// Unknown (-3)

// Late (-1)

非独占成员和标记特性

枚举的一个常见用途是代表一组互相排斥的值。 例如,ArrivalStatus 实例可以有 Early,OnTime 值,或 Late 值。 让 ArrivalStatus 实例的值反映多个枚举常量没有任何意义。

然而在其他情况下,枚举对象的值可以包括多个枚举成员,每个成员代表枚举值中的一个位域。 FlagsAttribute 属性可以用于指示位字段构成的枚举。 例如,名为 Pets 的枚举可能用于指示家庭宠物的种类。 它可以按如下定义。

C#

VB

复制

[Flags] public enum Pets { None=0, Dog=1, Cat=2, Bird=4, Rodent=8,

Reptile=16, Other=32 };

然后 Pets 枚举可如下例中所示来使用。

C#

VB

复制

Pets familyPets = Pets.Dog | Pets.Cat;

Console.WriteLine("Pets: {0:G} ({0:D})", familyPets);

// The example displays the following output:

// Pets: Dog, Cat (3)

定义按位枚举和应用 FlagsAttribute 特性时,应使用下面的最佳做法。

只有要对数值执行按位运算(AND、OR、XOR)时才对枚举使用 FlagsAttribute 自定义特性。

用 2 的幂(即 1、2、4、8 等)定义枚举常量。 这意味着组合的枚举常量中的各个标志都不重叠。

请考虑为常用标志组合创建一个枚举常量。 例如,如果用于文件 I/O 操作的枚举包含枚举常量 Read = 1 和 Write = 2,请考虑创建枚举常量 ReadWrite = Read OR Write,该常量组合了 Read 和 Write 标志。 此外,在某些情况下,可能会将用于组合标志的按位 OR 运算视为一种高级概念,在简单任务中不需要执行此操作。

将负数定义为标志枚举常量时应谨慎,因为很多标志位置都可能设置为 1,这可能使您的代码产生混淆并易于发生代码错误。

测试数字值是否设置在标记中的简便方法,是如下例所示调用实例 HasFlag 方法。

C#

VB

复制

Pets familyPets = Pets.Dog | Pets.Cat;

if (familyPets.HasFlag(Pets.Dog))

Console.WriteLine("The family has a dog.");

// The example displays the following output:

// The family has a dog.

在数值和标志枚举常量之间执行按位“与”操作是等效的,这种方法会将数值中与标志不对应的所有位都设置为零,然后测试该操作的结果是否等于该标志枚举常量。 下面的示例对此进行了阐释。

C#

VB

复制

Pets familyPets = Pets.Dog | Pets.Cat;

if ((familyPets & Pets.Dog) == Pets.Dog)

Console.WriteLine("The family has a dog.");

// The example displays the following output:

// The family has a dog.

将 None 用作值为零的标志枚举常量的名称。 在按位 AND 运算中,不能使用 None 枚举常量测试标志,因为所得的结果始终为零。 但是,您可以在数值与 None 枚举常量之间执行逻辑(不是按位)比较,以确定数值中是否已设置任何位。 下面的示例对此进行了阐释。

C#

VB

复制

Pets familyPets = Pets.Dog | Pets.Cat;

if (familyPets == Pets.None)

Console.WriteLine("The family has no pets.");

else

Console.WriteLine("The family has pets.");

// The example displays the following output:

// The family has pets.

不要仅为了反映枚举自身的状态而定义枚举值。 例如,不要定义仅用于标记枚举末尾的枚举常量。 如果需要确定枚举的最后一个值,请显式检查该值。 此外,如果枚举常量范围中的所有值都有效,还可以对第一个和最后一个枚举常量执行范围检查。

System.Enum 类例子

下面的示例演示使用一个枚举表示已命名的值,并使用另一个枚举表示已命名位域。

using System;

public class EnumTest {
    enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
    enum BoilingPoints { Celsius = 100, Fahrenheit = 212 };
    [FlagsAttribute]
    enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 };

    public static void Main() {

        Type weekdays = typeof(Days);
        Type boiling = typeof(BoilingPoints);

        Console.WriteLine("The days of the week, and their corresponding values in the Days Enum are:");

        foreach ( string s in Enum.GetNames(weekdays) )
            Console.WriteLine( "{0,-11}= {1}", s, Enum.Format( weekdays, Enum.Parse(weekdays, s), "d"));

        Console.WriteLine();
        Console.WriteLine("Enums can also be created which have values that represent some meaningful amount.");
        Console.WriteLine("The BoilingPoints Enum defines the following items, and corresponding values:");

        foreach ( string s in Enum.GetNames(boiling) )
            Console.WriteLine( "{0,-11}= {1}", s, Enum.Format(boiling, Enum.Parse(boiling, s), "d"));

        Colors myColors = Colors.Red | Colors.Blue | Colors.Yellow;
        Console.WriteLine();
        Console.WriteLine("myColors holds a combination of colors. Namely: {0}", myColors);
    }
}

继承层次结构

System.Object

System.ValueType

System.Enum

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

线程安全

此类型是线程安全的。

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。