.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,orulong,并且可以为任何项目指定显式值。如果显式指定了某些项,但没有明确指定,则最后定义的项之后的每个项将增加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 }
现在,您可以一次比较多个值,或者使用按位比较,或者如果使用的是.NET4.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)。