总目录
一、基本使用
enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。
- 默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。例如:
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
- 在此枚举中,Sat 为 0,Sun 为 1,Mon 为 2,依此类推。枚举数可以具有重写默认值的初始值设定项。例如:
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
在此枚举中,强制元素序列从 1 而不是 0 开始。但是,强烈建议枚举包含一个值为 0 的常量。
- 创建新的 Days 对象时,如果不显式为其赋值,则它将具有默认值 Days.Sunday (0)。创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。
- 如果将负数定义为标志枚举常量,请小心,因为许多标志位置可能设置为 1,这可能会使代码混淆并引发编码错误。
- 每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。枚举元素的默认基础类型为 int。若要声明另一整型枚举,例如 byte,请在标识符之后紧跟类型,然后再使用冒号:
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
- 准许使用的枚举类型有 byte、sbyte、short、ushort、int、uint、long 或 ulong。
二、位标志枚举
-
可以使用枚举类型定义位标志,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。(当然,某些组合在您的程序代码中可能没有意义或不允许使用。)
-
创建位标志枚举的方法是应用 System.FlagsAttribute 属性并适当定义一些值,以便可以对这些值执行 AND、OR、NOT 和 XOR 按位运算
-
以 2 的幂定义枚举常量,即 1、2、4、8 等。 这意味着组合枚举常量中的单个标志不重叠。
具体使用案例如下:
[Flags]
enum Days2
{
None = 0x0,
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40
//以上16进制值 转化为10进制分别为 0,1,2,4,8,16,32,64
//以 2 的幂定义枚举常量,即 1、2、4、8 等。 这意味着组合枚举常量中的单个标志不重叠。
}
internal class Program
{
static void Main(string[] args)
{
// 【标志位枚举的使用】
//使用 | 运算符 取并集
Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
meetingDays = meetingDays | Days2.Friday;
Console.WriteLine("Meeting days are {0}", meetingDays);
//经过两次 | 的运算,最后取得的并集是: Tuesday, Thursday, Friday
//输出信息: Meeting days are Tuesday, Thursday, Friday
//使用 & 是取交集,在此案例中 是取meetingDays 和Days2.Saturday的交集
meetingDays &= Days2.Saturday;
Console.WriteLine("Meeting days are {0}", meetingDays);
//显然,二者并无交集
//输出信息:Meeting days are None
// 使用^ 是取差集,
meetingDays = Days2.Tuesday | Days2.Thursday;//重新取并集
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
//输出信息:Meeting days are Thursday
meetingDays|= Days2.Saturday;
Days2 md = Days2.Wednesday | Days2.Sunday;
meetingDays^= md;
Console.WriteLine("Meeting days are {0}", meetingDays);
//输出信息:Meeting days are Sunday, Wednesday, Thursday, Saturday
//若要确定是否设置了特定标志,请使用逻辑 AND 运算
// 当我们需要判断是否在某个枚举组合中,可以使用&,具体运用如下:
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.
Console.ReadKey();
}
}
- 给Enum定义Flag 特性 和不定义Flag的区别如下:
[Flags]
enum Color1
{
None=0,
Red = 1,
Green = 2,
Blue = 4,
Yellow = 8,
}
enum Color2
{
None = 0,
Red = 1,
Green = 2,
Blue = 4,
Yellow = 8,
}
internal class Program
{
static void Main(string[] args)
{
var or1 = Color1.Green | Color1.Blue;
var or2 =Color2.Green | Color2.Blue;
Console.WriteLine($"【or1={or1}】--【or2={or2}】");
//【or1=Green, Blue】--【or2=6】
//or1 是做并集, or2 的计算过程如下
//Color2.Green ==>2==> 0000 0010
//Color2.Blue ==>4==> 0000 0100
//==================================没有Flag特性标签则按 或位运算符运算
//均为0则为0,其余为1 0000 0110 ===》转为10进制 结果为6
var and1 =(Color1.Blue|Color1.Green) & Color1.Green;
var and2= (Color2.Blue | Color2.Green) & Color2.Green;
Console.WriteLine($"【and1={and1}】--【and2={and2}】");
//【and1 = Green】--【and2 = Green】
Console.ReadKey();
}
}
通常可以将位标志枚举应用于系统权限中
结语
以上就是本文的内容,希望以上内容可以帮助到您,如文中有不对之处,还请批评指正。