C#枚举类型解析

以你之姓@ 2022-06-12 09:58 352阅读 0赞

枚举是开发者可以定义的一个类型。枚举的关键特征是它标识了一个在编译时定义的所有可能值得集合,每个值都由一个名称来引用,这就使得代码更加的易读。我们采用与类相似的语法来定义一个枚举(枚举类型的声明必须跟类是平级的),如:

  1. enum ConnectionState
  2. {
  3. Disconnected,
  4. Connecting,
  5. Connected,
  6. Disconnecting
  7. }

布尔类型的参数也适合使用枚举。例如:像SetState(DeviceState.On)这样的方法调用要比SetState(true)更易读。

要引用一个枚举值,需要为其附加枚举名称前缀。例如,要引用Connected的值,需要使用ConnectionState.Connected。在枚举值名称中,不允许使用枚举名称,根据约定,枚举名称本身应该使用单数形式,除非枚举是为标志。

默认情况下,第一个枚举值是0(技术上说,是0显式转型为基础枚举类型),后续每一项都递增1,然而可以显式的为枚举赋值,代码如下:

  1. //显式的为枚举值赋值
  2. enum ConnectionState : short
  3. {
  4. Disconnected,
  5. Connecting=10,
  6. Connected,
  7. Joined=Connected,
  8. Disconnecting
  9. }

Disconnected任然具有默认值0,Connection被赋值为10,后面Connected的值为11,随后Joined也被赋值为11也就是有Connected引用的值(将Connected引用的值赋给Joined时,不需要为Connected附加枚举名称前缀,因为目前正处在枚举的作用域内)。Disconnecting自动递增1,值为12.

枚举总是具有一个基础类型,这可能是int,uint,long和ulong,但不能使char。

事实上,枚举类型的性能完全取决于基础类型的性能。默认的基础类型为int,但是可以使用继承的语法来指定一个不同的类型。

在上面的代码中,使用的是short,而不是int。为了保持一致性,这里使用了继承的语法,但没有建立真正的继承关系。

枚举之间的类型兼容性

C#不支持两个不同的枚举数组之间的直接转型。但是可以使用强制的转换,就是先转型为一个数组,在转型为第二个枚举。这里要求两个枚举具有相同的基础类型,而且必须先转型为System.Array,代码如下:

  1. static void Main(string[] args)
  2. {
  3. ConnectionState1[] states = (ConnectionState1[])(Array)new ConnectionState2[42];
  4. }
  5. //枚举数组之间的转型
  6. enum ConnectionState1
  7. {
  8. Disconnected,
  9. Connecting,
  10. Connected,
  11. Disconnecting
  12. }
  13. enum ConnectionState2
  14. {
  15. Disconnected,
  16. Connecting,
  17. Connected,
  18. Disconnecting
  19. }

这个技巧利用了ClR的赋值兼容性比C#宽松这一事实。(还可以同样的技巧进行非法转换,比如int[]转换为uint[])。然而,使用时必须谨慎,C#规范没有说不同的CLR实现中,这个技巧都应该正常的发挥作用。

发表评论

表情:
评论列表 (有 0 条评论,352人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C#--StringComparison

    在C\中,StringComparison 枚举用于指定字符串比较操作的规则。字符串比较在各种情况下都非常重要,例如在排序、搜索、区分大小写和不区分大小写的比较等情况下都会用到

    相关 C#——类型

    C\——枚举类型 枚举类型 是由基础整型数值类型的一组命名常量定义的值类型。 若要定义枚举类型,请使用 enum 关键字并指定枚举成员 的名称: enum Se

    相关 C#——类型

    C\——枚举类型 枚举类型 是由基础整型数值类型的一组命名常量定义的值类型。 若要定义枚举类型,请使用 enum 关键字并指定枚举成员 的名称: enum Se

    相关 C#类型

    枚举是开发者可以定义的一个类型。枚举的关键特征是它标识了一个在编译时定义的所有可能值得集合,每个值都由一个名称来引用,这就使得代码更加的易读。我们采用与类相似的语法来定义一个枚