Enum关键字用于声明枚举,即一种由一组称为枚举数列表的命名常数组成的独特类型。每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。枚举元素的默认基础类型为 int。默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。
1.Enum可以使用基类选项来声明成员类型 ,注意,即使枚举的基础类型是 long,枚举成员仍然必须使用强制转换显式转换为 long 类型。
enum Range : long { Max = 2147483648L, Min = 255L };
long x =(long) Range.Max;
long y = (long)Range.Min;
2.位域支持的运算符
(1)|,enum值的二进制数或运算
(2)&,enum值的二进制与运算
(3)^,enum值的二进制异或运算
当enum所有项的二进制与运算值为0时:
“|”:表示两边求并集(元素相加,相同元素只出现一次)
“&”:表示两边是否其中一个是另外一个的子集,如果是返回子集,否则返回0(如果其中一个包含另外一个,返回被包含的,否则返回0)
“^”:表示从两者的并集中去除两者的交集(把两个的元素合并到一起,如果两个中有公共元素,要将这个公共元素从合并的结果中去除)
当进行位域运算,用flags声明了一个位域,与枚举不同,位域支持不同的&和|操作。对于普通枚举,|和&操作代表二进制比特操作 [Flags]
public enum Seasons
{
//定义一个枚举类型
春天 = 1,
夏天 = 2,
秋天 = 4,
冬天 = 8
}
class Program
{
static void Main(string[] args)
{
//两边求并集
Seasons season = Seasons.春天 | Seasons.夏天;
Console.WriteLine(season);
//求子集
season = (Seasons.春天 | Seasons.夏天 | Seasons.秋天) & (Seasons.春天 | Seasons.夏天);
Console.WriteLine(season);
//并集中去除两者的交集
season = (Seasons.春天 | Seasons.夏天 | Seasons.秋天) ^ (Seasons.春天 | Seasons.夏天);
Console.WriteLine(season);
Console.Read();
}
}
输出的结果为: 春天,夏天
春天,夏天
秋天
如果不加[Flags]输出为: 3
3
秋天
当enum所有项的二进制与运算值不为0时:
[Flags]
public enum Seasons
{
//定义一个枚举类型
春天 = 1,
夏天 = 2,
秋天 = 3,
冬天 = 4
}
class Program
{
static void Main(string[] args)
{
//两边求并集
Seasons season = Seasons.春天 | Seasons.夏天;
Console.WriteLine(season);
//求子集
season = (Seasons.春天 | Seasons.夏天 | Seasons.秋天) & (Seasons.春天 | Seasons.夏天);
Console.WriteLine(season);
//并集中去除两者的交集
season = (Seasons.春天 | Seasons.夏天 | Seasons.秋天) ^ (Seasons.春天 | Seasons.夏天);
Console.WriteLine(season);
Console.Read();
}
}
输出结果为: 秋天
秋天
0
因为位域在进行二进制位运算,1|2|3=3,而1|2|4|=7每个数字将代表不同的含义。
3.Enum.Parse
[Flags]
public enum Seasons
{
//定义一个枚举类型
春天 = 1,
夏天 = 2,
秋天 = 4,
冬天 = 8,
}
class Program
{
static void Main(string[] args)
{
Seasons season =(Seasons) Enum.Parse(typeof(Seasons),"春天,夏天",false);
Console.WriteLine(season);
season = (Seasons)Enum.Parse(typeof(Seasons), "7", false);
Console.WriteLine(season);
Console.Read();
}
}
输出 春天,夏天
春天,夏天,秋天
","隔开的项是进行异或处理,“春天,夏天”是值进行了异或处理为3
输出时:
Console.WriteLine(season.ToString());
输出Enum项名
Console.WriteLine(season.ToString(“d”));
输出Enum项值