【CLR Via C#】15 枚举类型与位类型
1、基础
- 枚举类型(enumerated types)定义了一组“符号名称/值”配对。
- 枚举类型是值类型,每个枚举类型都是从System.Enum派生的,而System.Enum又是从System.ValueType派生,而其后又是从System.Object派生而来
- 枚举类型没有方法属性和事件,但是可以通过扩展方法进行模拟向枚举类型添加方法。
2、例子与IL分析
对于以下的一个枚举类型,通过IL可以知道其内部的结构如下图(1-1)所示:
public enum Color{ White, Red, Green, Blue, Orange }
通过IL代码可知,对于Blue,Green等其内部实现是常量int32的类型,该枚举类型继承与System.Enum类。C#编译器将枚举类型视为基元类型,所以可以用许多操作符(==,!=,<,>,<=,>=,+,-,^,&,|,~,++和--来操作没绝类型的实例,这些操作符实际上作用于每个枚举类型实例内部的value__实例字段。
3、对于System.Enum下的常用静态方法
编号 | 名称 | 说明 |
---|---|---|
1 | GetName | 在指定枚举中检索具有指定值的常数的名称。 |
2 | GetNames | 检索指定枚举中常数名称的数组。 |
3 | GetUnderlyingType | 返回指定枚举的基础类型。 |
4 | GetValues | 检索指定枚举中常数值的数组。 |
5 | IsDefined | 返回指定枚举中是否存在具有指定值的常数的指示。 |
6 | Parse(Type, String) | 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 |
7 | Parse(Type, String, Boolean) | 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否不区分大小写。 |
8 | TryParse<TEnum>(String, TEnum) | 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值。 |
9 | TryParse<TEnum>(String, Boolean, TEnum) | 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否区分大小写。 用于指示转换是否成功的返回值。 |
4、位标志(FlagsAttribute特性)
枚举类型表示单个数值,而位标志表示一组位,其中有些位处于on状态,有些位处于off状态。【二进制中1代表on,0代表off】,对于位标志的枚举实例输出内部会直接ToString输出,将会直接格式化与名字枚举名称相对应的字符串并且中间用逗号隔开。具体的代码如下所示,其生成后的结果如图1-2
using System; public class temp { public static void Main(){ var color=Color.Green | Color.Red; Console.WriteLine(color); } } [Flags] public enum Color{ White=1, Red=2, Green=4, Blue=8, Orange=16 }