当前位置: 首页 > 图文教程 > .Net技术 > ASP.NET > ASP.NET:小议枚举类型
1.类型本质
所有枚举类型都隐式而且只能隐式地继承自System.Enum类型,System.Enum类型是继承自System.ValueType类型唯一不为值类型的引用类型。该类型的定义为: public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible 从该定义中,我们可以得出以下结论: l System.Enum类型是引用类型,并且是一个抽象类。 l System.Enum类型继承自System.ValueType类型,而ValueType类型是一切值类型的根类,但是显然System.Enum并非值类型,这是ValueType唯一的特例。 l System.Enum类型实现了IComparable、IFormattable和IConvertible接口,因此枚举类型可以与这三个接口实现类型转换。 .NET之所以在ValueType之下实现一个Enum类型,主要是实现对枚举类型公共成员与公共方法的抽象,任何枚举类型都自动继承了Enum中实现的方法。关于枚举类型与Enum类型的关系,可以表述为:枚举类型是值类型,分配于线程的堆栈上,自动继承于Enum类型,但是本身不能被继承;Enum类型是引用类型,分配于托管堆上,Enum类型本身不是枚举类型,但是提供了操作枚举类型的共用方法。 下面我们根据一个枚举的定义和操作来分析其IL,以从中获取关于枚举的更多认识:
enum LogLevel { Trace, Debug, Information, Warnning, Error, Fatal }
将上述枚举定义用Reflector工具翻译为IL代码,对应为:
.class private auto ansi sealed LogLevel extends [mscorlib]System.Enum { .field public static literal valuetype InsideDotNet.Framework.EnumEx.LogLevel Debug = int32(1) .field public static literal valuetype InsideDotNet.Framework.EnumEx.LogLevel Error = int32(4) .field public static literal valuetype InsideDotNet.Framework.EnumEx.LogLevel Fatal = int32(5) .field public static literal valuetype InsideDotNet.Framework.EnumEx.LogLevel Information = int32(2) .field public static literal valuetype InsideDotNet.Framework.EnumEx.LogLevel Trace = int32(0) .field public specialname rtspecialname int32 value__ .field public static literal valuetype InsideDotNet.Framework.EnumEx.LogLevel Warnning = int32(3) }
public static void Main() { LogLevel logger = LogLevel.Information; Console.WriteLine("The log level is {0}.", logger); } 该过程实例化了一个枚举变量,并将它输出到控制台,对应的IL为: .method public hidebysig static void
分析IL可知,首先将2赋值给logger,然后执行装箱操作(L_0009),再调用WriteLine方法将结果输出到控制台。
2.枚举规则
enum MusicType
{ Blue, Jazz = Pop, Pop }
Week myweek = Week.Mon; 也可以以new关键字来实例化,例如:
Week myweek = new Week(); 值得注意的是,此时myweek并不等于Week枚举类型中定义的第一个成员的Sun的关联值7,而是等效于字面值为0的成员项。如果枚举成员不存在0值常数,则myweek将默认设定为0,可以从下面代码来验证这一规则:
enum WithZero { First = 1, Zero = 0 } enum WithNonZero { First = 1, Second } class EnumMethod { public static void Main() { WithZero wz = new WithZero(); Console.WriteLine(wz.ToString("G")); WithNonZero wnz = new WithNonZero(); Console.WriteLine(wnz.ToString("G")); } } //执行结果//Zero //0
评论 (0) All