标签:
Enumeration提供了一些非常炫酷的功能,相信大多数开发人员都不熟悉。而这些新功能极大的简化了应用程序的开发。
枚举类型(enumerated types)定义了一组“符号名称/值”配对。
以下Color类型定义了一组符号,每个符号都标识一种颜色:
internal enum Color { White,//赋值0 Red, //赋值1 Greed,//赋值2 Blue, //赋值3 Orange//赋值4 }
当然,我们也可以写个程序用0代表白色,1代表红色,以此类推。
但不应该将这些数字硬编码到代码中,而应该换用枚举类型,因为:
每个枚举类型都直接从System.Enum派生,后者从System.ValueType派生。而System.ValueType又从System.Object派生。所以,枚举类型是值类型,可表示成未装箱和已装箱形式。有别于其他的值类型,枚举类型不能定义任何方法、属性和事件。
编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段。例如,编译器会把前面的Color枚举类型看成以下代码:
但C#编译器实际上并不编译上面这段代码,因为它禁止定义从System.Enum这一特殊类型派生的类型。
枚举类型定义的符号是常量值,所以当C#编译器一旦发现代码中引用了一个枚举类型的符号,就会在编译时用数值替代符号,代码将不再引用定义了符号的枚举类型。
简单地来说,枚举类型只是一个结构,其中定义了一组常量字段和一个实例字段。常量字段会嵌入到程序集的元数据中,并可通过反射来访问。这意味着在运行时,获得了与一个枚举类型关联的所有符号及其值。还意味着我们可以将一个字符串符号转换成其对应的数值。
下面来讨论System.Enum类型中的一些主要方法:
GetUnderlyingType:
public static Type GetUnderlyingType(Type enumType);
该方法返回用于容纳一个枚举类型的值的基础类型。每个枚举类型都有一个基础类型,可以是byte,short,int(最常用,也是C#默认选择的),long等。
注意:
以下代码演示了如何声明一个基础类型为byte的枚举类型:
internal enum Color : byte { White, Red, Greed, Blue, Orange } static void Main() { Console.WriteLine(Enum.GetUnderlyingType(typeof(Color))); //System.Byte }
C#中typeof() 和 GetType()区别:
C#编译器将枚举类型视为基元类型,所以,我们可以使用许多熟悉的操作符(==,!=,<,>,<=,>=,+,-,^,&,|,++,--)来操纵枚举类型的实例。所有这些操作符实际作用于每个枚举类型实例内部的value_实例字段。
ToString:
public string ToString(string format);
给定一个枚举类型的实例,我们可以调用从System.Enum继承的ToString方法。
public static class Program { static void Main() { Color c = Color.Blue; Console.WriteLine(c.ToString());//"Blue" 常规格式 Console.WriteLine(c.ToString("G"));//"Blue" 常规格式 Console.WriteLine(c.ToString("D"));//"3" 十进制格式 Console.WriteLine(c.ToString("X"));//"03" 十六进制格式 } } internal enum Color : byte { White, Red, Greed, Blue, Orange }
Format:
public static string Format(Type enumType, object value, string format);
可调用它格式化一个枚举类型的值。
Console.WriteLine(Enum.Format(typeof(Color), 3, "G"));//显示"Blue"
GetValues:
public static Array GetValues(Type enumType);
获取枚举类型中定义的所有符号以及对应的值。
Color[] colors = (Color[])Enum.GetValues(typeof(Color)); Console.WriteLine("Number of symbols defined:" + colors.Length); Console.WriteLine("Value\tSymbol\n-----\t------"); foreach (Color c in colors) { Console.WriteLine("{0,5:D}\t{0:G}", c); }
GetName:
public static string GetName(Type enumType, object value);
返回数值的字符串表示。
Enum.GetName(typeof(Color), 3);//"Blue"
GetNames:
public static string[] GetNames(Type enumType);
返回一个String数组,每个符号都代表一个String。
Enum.GetNames(typeof(Color)); //{string[5]} //[0]: "White" //[1]: "Red" //[2]: "Greed" //[3]: "Blue" //[4]: "Orange"
Parse:
public static object Parse(Type enumType, string value, bool ignoreCase)
将一个符号转换成枚举类型的实例。
Color c = (Color)Enum.Parse(typeof(Color), "orange", true); //Orange Enum.Parse(typeof(Color), "0", true);//White
TryParse:
public static bool TryParse<TEnum>(string value, bool ignoreCase, out TEnum result) where TEnum : struct;
将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。用于指示转换是否成功的返回值。
TryParse方法类似于Parse方法,不同之处在于TryParse方法在转换失败时不引发异常。
bool a=Enum.TryParse<Color>("Brown", false, out c);//false, 枚举中没有定义Brown
IsDefine:
public static bool IsDefined(Type enumType, object value);
判断一个值对于一个枚举类型是否合法。
Enum.IsDefined(typeof(Color), "white");//false, 执行的是区分大小写的检查 Enum.IsDefined(typeof(Color), 5);//false, Color枚举类型没有与5对应的符号
标签:
原文地址:http://www.cnblogs.com/chrisghb8812/p/5509556.html