什么是枚举呢?
枚举是一组命名整型常量。枚举类型是使用enum关键字声明的,与类同级。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能访问修饰符。枚举本身的修饰符仅能使用public和internal。
C#枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。
枚举是用户定义的整数类型。在声明一个枚举时,要指定该枚举的实例可以包含的一组可接受的值。不仅如此,还可以给值指定易于记忆的名称。如果在代码的某个地方,要视图把一个不在可接受范围内的值赋予枚举的一个实例,编译器就会报告一个错误。
从长远来看,创建枚举可以节省大量时间,减少许多麻烦。使用枚举比使用无格式的整数至少有如下3个优势。
例子:
public enum TimeOfDay
{
Morning = 0,
Afternoon = 1,
Evening = 2
}
本例子在枚举中使用一个整数值,来表示一天的每个阶段。现在可以把这些值作为枚举的成员来访问。例如,TimeOfDay.Morining返回数字0.使用这个枚举一般是把合适的值传送给方法,并在Switch语句中迭代可能的值。
class EnumExample
{
public static int Main()
{
WriteGreeting(TimeOfDay.Morning);
return 0;
}
static void WriteGreeting(TimeOfDay timeOfDay)
{
switch (timeOfDay)
{
case TimeOfDay.Morning:
Console.WriteLine("Good moring!");
break;
case TimeOfDay.Afternoon:
Console.WriteLine("Good afternoon!");
break;
case TimeOfDay.Evening:
Console.WriteLine("Good evening!");
break;
default:
Console.WriteLine("Hello!");
break;
}
}
}
在C#中,枚举的真正强大之处是它们在后台会实例化为派生于基类System.Enum的结构。这表示可以对它们调用方法,执行有用的任务。注意因为.NET Framework的执行方式,在语法上把枚举当做结构不会造成性能损失。实际上,一旦代码编译好,枚举就称为基本类型,与int和float类似。
可以获取枚举的字符串表示,例如使用前面的TimeOfDay枚举:
TimeOfDay time = TimeOfDay.Afternoon;
Console.WriteLine(time.ToString());
会返回字符串Afternoon。
另外,还可以从字符串中获取枚举值:
TimeOfDay time2 = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), "afternoon", true);
Console.WriteLine((int)time2);
这段代码说明了如何从字符串获取枚举值,并转换为整数。要从字符串中转换,需要使用静态的Enum.Parse()方法,这个方法带3个参数。第一个参数是要使用的枚举类型,其语法是关键字typeof后跟放在括号中的枚举类名。第二个参数是要转换的字符串,第三个参数是一个bool,指定在进行转换时是否忽略大小写。最后,注意Enum.Parse()方法实际上返回一个对象引用——我们需要把这个字符显式转换为需要的枚举类型(这是一个拆箱操作的例子)。对于上面的代码,将返回1,作为一个对象,对应于TimeOfDay.Afternoon的枚举值。在显式转换为int时,会再次生成1。
System.Enum上的其他方法可以返回枚举定义中的值的个数或列出值的名称等。
枚举的使用建议:
当参数、返回值、变量等类型可以使枚举,尽量使用枚举(要注意考虑分类的稳定性)
大多数情况下都可以使用int类型枚举,下列情况除外。
枚举可能被大量频繁使用,这时为了节约空间可以使用小于int类型的枚举。
标志枚举,且标志多于32个。
C#提供一个类来方便操作枚举,下面给出这个类的常用方法:
方法 |
名称 |
ConmpareTo |
将此实例与指定对象进行比较并返回一个对二者的相对值的指示 |
Equals |
指示此实例是否等于指定的对象 |
Format |
根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式 |
GetName |
在指定枚举中检索具有指定值的常数的名称 |
GetNames |
检索指定枚举中常数名称的数组 |
GetTypeCode |
返回此实例的基础TypeCode |
GetUnderyingType |
返回指定枚举的基础类型 |
GetValues |
索指定枚举中常数值的数组 |
HasFlag |
确定当前实例中是否设置了一个或多个位域 |
IsDefined |
返回指定枚举中是否存在具有指定值的常数的指示 |
Parse |
将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。一个参数指定该操作是否不区分大小写 |
TryParse |
将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。用于指示转换是否成功的返回值 |