.NET Framework 枚举定义

示例

枚举是一种特殊的类。该enum关键字告诉编译器,这个类从抽象继承System.Enum类。枚举用于不同的项目列表。

public enum MyEnum
{
    Monday = 1,
    Tuesday,
    Wednesday,
    //...
}

您可以将枚举视为将常量映射到某些基础值的便捷方法。上面定义的枚举声明一周中每一天的值,并以开头1。Tuesday随后将自动成为映射到2,Wednesday要3等

默认情况下,枚举int用作基础类型并从0开始,但是您可以使用以下任何整数类型:byte, sbyte, short, ushort, int, uint, long, or ulong,并且可以为任何项目指定显式值。如果显式指定了某些项,但没有明确指定,则最后定义的项之后的每个项将增加1。

我们将通过其他一些值强制转换MyEnum来使用此示例,如下所示:

MyEnum instance = (MyEnum)3; // 名为“ instance”的变量得到一个 
                             //MyEnum.Wednesday的值,它映射到3。

int x = 2;
instance = (MyEnum)x; // 现在'instance'的值为MyEnum.Tuesday

另一个有用但复杂的枚举类型称为Flags。通过用属性装饰枚举Flags,可以一次为一个变量分配多个值。请注意,在执行此操作时,必须以2为底的表示形式明确定义值。

[Flags]
public enum MyEnum
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32, 
    Sunday = 64
}

现在,您可以一次比较多个值,或者使用按位比较,或者如果使用的是.NET 4.0或更高版本,则可以使用内置Enum.HasFlag方法。

MyEnum instance =MyEnum.Monday| MyEnum.Thursday; // 实例的值现在为
                                                   // *两个*星期一和星期四,
                                                   // 用0100表示​​(以二进制表示)。 

if (instance.HasFlag(MyEnum.Wednesday))
{
    // 它没有,所以跳过了该块
}
else if (instance.HasFlag(MyEnum.Thursday))
{
    // 确实如此,所以执行了该块
}

由于Enum类是的子类System.ValueType,因此将其视为值类型,并按值而不是按引用传递。基础对象是在堆上创建的,但是当您将枚举值传递给函数调用时,使用枚举的基础值类型(通常为System.Int32)的值的副本将被推入堆栈。编译器跟踪此值与在堆栈上创建的基础对象之间的关联。有关更多信息,请参见ValueType类(系统)(MSDN)。