枚举类型 是由基础值类型(byte、int、long等)组成的一组命名常量的值类型,用enum
来申明定义。常用于一些有固定值的类别申明,如性别、方向、数据类型等。
- 枚举成员默认是
int
,可以修改为其他整数类型,如byte
、short
、uint
、long
等。 - 枚举项可设置值,也可省略,或者部分设置值。值默认是从
0
开始,并按顺序依次递增。 - 枚举变量的默认值始终是
0
。 - 枚举本质上就是命名常量,因此可以与值类型进行相互转换(强制转换)。
- 特性
Description
常用来定义枚项在UI上的显示内容,使用反射获取。
public enum UserType : int //常量类型,可以修改为其他整数类型 { [Description("普通会员")] Default, VIP = 10, SupperVIP, //继续前一个,值为11 } void Main() { var t1 = UserType.Default; Console.WriteLine(t1.ToString()); //输出名称:Default Console.WriteLine((int)t1); //输出值:0 Console.WriteLine($"{t1:F}"); //输出名称:Default Console.WriteLine($"{t1:D}"); //输出值:0 var t2 = (UserType)0; int t3 = (int)UserType.Default; Console.WriteLine(t1 == t2); //True }
2.1、Enum 类API
System.Enum 类型是所有枚举类型的抽象基类,提供了一些API方法用于枚举的操作,基本都是静态方法。Enum 类型还可以作为泛型约束使用。
🔸静态成员 | 说明 |
HasFlag(Enum) | 判断(位域)枚举是否包含一个枚举值,返回bool |
🔸静态成员 | 说明 |
GetName<TEnum>(TEnum) |
获取枚举值的(常数)名称 |
GetNames<TEnum>() |
获取枚举定义的所有(常数)名称数组 |
GetValues<TEnum>() |
获取枚举定义的所有成员数组 |
IsDefined(Type, Object) | 判断给定的值(数值或名称)是否在枚举中定义 |
Parse<TEnum>(String) |
解析数值、名称为枚举,转换失败抛出异常 |
TryParse<TEnum>(String, TEnum) |
安全的转换,同上,转换结果通过out参数输出,返回bool 表示是否转换成功 |
🔸其他 | 说明 |
Type.IsEnum | Type 的属性,用于判断一个类型是否枚举类型 |
2.2、位域Flags
枚举位域用[Flags]
特性标记,从而可以使用枚举的位操作,实现多个枚举值合并的的能力。在有些多选值的场景很有用,用一个数值可表示多个内容,如QQ的各种钻(绿钻、红钻、黄钻...)用一个值就可以表示,参考下面代码示例。
- 枚举定义时加上特性
[Flags]
。 - 要求枚举值必须是
2的n次方
,主要是各个成员的二进制值的对应位都不能一样,才能保障按位与、按位或运算的正确。 - 合并值用按位或
|
,判断是否包含可以用按位与&
,或者方法HasFlag(e)
。 - 枚举类型命名一般建议用复数名词。
void Main() { var t1 = QQDiamond.Green|QQDiamond.Red; //按位或运算,合并多个成员值 Console.WriteLine((int)t1); //3,同时为绿钻、红钻 //判断是否绿钻 Console.WriteLine(t1.HasFlag(QQDiamond.Green)); //True //判断是否红钻,效果同上 Console.WriteLine((t1 & QQDiamond.Red) == QQDiamond.Red); //True } [Flags] public enum QQDiamond : sbyte { None=0b0000, //或者0 [Description("绿钻")] Green=0b0001, //或者1 Red=0b0010, //或者2、1<<1 Blue=0b0100, //或者4、1<<2 Yellow=0b1000,//或者8、1<<3 }
2.3、枚举值转换
枚举值为整形,枚举名称为string,因此常与int、string进行转换。
🔸转换为枚举 | 说明 |
Enum.Parse()/TryParse() | 转换枚举值(字符串形式)、枚举名称为枚举对象,支持位域Flgas |
TEnum(int) | 强制转换整形值为枚举,如果没有不会报错,支持位域Flgas |
/Parse/TryParse方法解析 var t1 = Enum.Parse<QQDiamond>("3"); //Green var t2 = Enum.Parse<QQDiamond>("Green"); //Green //强转 QQDiamond t3 =(QQDiamond)56;
🔸枚举转换为string、int | 说明 |
ToString() | 获取枚举名称,支持位域Flgas |
Enum.GetName(e) | 获取枚举名称,不支持位域Flgas |
字符格式:G(或F) | 获取枚举名称,其中F主要用于Flgas枚举 |
强制类型转换:(int)TEnum |
获取枚举值 |
字符格式:D(或X) | 格式化中获取枚举值,D为十进制整形,X为16进制 |
//string var s1 = qd.ToString(); //Green var s2 = Enum.GetName(qd); //Green 不支持位于Flgas var s3 = $"{qd:G}"; //Green //int var n1 = (int)qd; //1 var n2 = $"{qd:D}"; //1