第15章 枚举类型和位标记
15.1 枚举类型
枚举类型使程序容易编写、阅读和维护
枚举类型是强类型的。
每个枚举类型都直接从System.Enum派生,后者从System.ValueType派生,而System.ValueType又从System.Object派生。枚举是值类型。可表示成未装箱和已装箱形式。
可利用C#的“扩展方法”功能模拟向枚举类型添加方法。
枚举类型定义的符号是常量值。所以当编译器一旦发现代码引用了一个枚举类型的符号,就会在编译时用数值替换符号,代码将不再引用定义了符号的枚举类型。这意味着在运行时可能并不需要定义了枚举类型的程序集,在编译时才需要。
可以用IsDefined方法判断一个数值将对一个枚举类型是否合法。
using System;
namespace EnumApp
{
class Program
{
static void Main()
{
Console.WriteLine(IfExist(10));
Console.WriteLine(IfExist(1));
}
static bool IfExist(byte b)
{
return Enum.IsDefined(typeof(Color), b);
}
}
enum Color : byte
{
White = 2,
Red = 4
}
}
15.2 位标记
虽然枚举类型和位标记相似,它们的语义不尽相同。例如,枚举类型表示单个数值,而位标记表示一组位,其中有些位处于on状态,有些处于off状态。
class Program
{
static void Main()
{
Colors colors = Colors.Red | Colors.White;
Console.WriteLine(colors); //White, Red
}
}
[Flags]
enum Colors : byte
{
White = 2,
Red = 4
}
永远不要对位标志枚举类型使用IsDefined方法。
15.3 向枚举类型添加方法(扩展方法)
static class Program
{
static void Main()
{
}
public static void SetColors(this Colors colors, Colors SetColors)
{
colors = SetColors;
}
}
[Flags]
public enum Colors : byte
{
White = 2,
Red = 4
}