枚举是一个值类型
枚举是一个值类型, 包含一组命名的常量, 枚举类型用 enum 关键字定义
public enum Color
{
Red,
Green,
Blue // 注意最后一个常量值没有逗号
}
可以声明枚举类型的变量, 如变量 c1, 用枚举类型的名称作为前缀,设置一个命名常量,来赋予枚举中的一个值
Color c1 = Color.Red;
Console.WriteLine( c1 );
// 控制台输出
// Red
运行程序, 控制台输出显示 Red, 这是枚举的常量值。
默认情况下, enum 的类型是 int。 这个基本类型可以改为其他整数类型 (byte、short、int 、带符号的 long 和 无符号变量)。
命名常量的值从0开始递增,但它们可以改为其他值:
public enum Color : short
{
Red = 1,
Green = 2,
Blue = 3
}
使用强制类型转换可以把数字改为枚举值, 把枚举值改为数字。
Color c2 = (Color)2;
short number = (short) c2;
Flags 属性
还可以使用 enum 类型把多个选项分配给一个变量, 而不仅仅是一个枚举常量。为此,分配给常量的值必须是不同的位, Flags属性需要用枚举设置。
[Flags]
public enum DaysOfWeek
{
Monday = 0x1,
Tuesday = 0x2,
Wednesday = 0x4,
Thursday = 0x8,
Friday = 0x10,
Saturday = 0x20,
Sunday = 0x40
}
DaysOfWeek 为每天定义了不同的值。 要设置不同的位, 可以使用 0x 前缀指定的 十六进制轻松完成, Flags 属性是编译器创建值的另一个字符串表示的信息, 例如给 DaysOfWeek 的一个变量设置值3, 结果 Monday ,如果使用 Flags 属性,结果就是 Tuesday 。 有了这个枚举声明, 就可以使用逻辑或运算符为一个变量指定多个值:
DaysOfWeek mondayAndWednesday = DaysOfWeek.Monday | DaysOfWeek.Wednesday;
Console.WriteLine( mondayAndWednesday );
// 控制台输出
// Monday , Tuesday
设置不同的位, 也可以结合单个位来包括多个值, 如 Weekend 的值 0x60 是用逻辑或运算符结合了 Saturday 和 Sunday 。Workday 则结合了从 Monday 到 Friday
的所有日子, AllWeek 用逻辑或运算符结合了 Workday 和 Weekend
[Flags]
public enum DaysOfWeek
{
Monday = 0x1,
Tuesday = 0x2,
Wednesday = 0x4,
Thursday = 0x8,
Friday = 0x10,
Saturday = 0x20,
Sunday = 0x40,
Weekend = Saturday | Sunday,
Workday = 0x1f,
AllWeek = Workday | Weekend
}
动态获得枚举类型的信息
Enum 类有时非常有助于动态获得枚举类型的信息。 枚举提供了方法来解析字符串, 获得相应的枚举常数, 获得枚举类型的所有名称和值。
Enum.TryParse
Color red;
if( Enum.TryParse<Color>("Red", out red) )
{
Console.WriteLine( string.Format("successfully parsed {0}", red) );
}
// 控制台输出
// Red
注意: Enum.TryParse<T>() 是一个泛型方法, 其中T是泛型参数类型。
Enum.GetNames
该方法返回一个包含所有枚举名的字符串数组:
foreach( var day in Enum.GetNames( typeof(Color) ) )
{
Console.WriteLine( day );
}
// 控制台输出
// Red
// Green
// Blue
Enum.GetValues
为了获得枚举的所有值, 可以使用 Enum.GetValues 。 Enum.GetValues 返回枚举值的一个数组。 为了获得整数值, 需要把它转换为枚举的底层类型, 为此应使用 foreach语句:
foreach( short val in Enum.GetValues( typeof(Color) ) )
{
Console.WriteLine( val );
}
// 控制台输出
// 1
// 2
// 3