指定枚举类型的底层类型有什么用途?

19

有什么意义

enum SomeEnum : byte // <----
{
  SomeValue = 0x01,
  ...
}

当你必须进行强制类型转换,只为了将其赋值给与枚举底层类型相同的变量类型时,该怎么办?

byte b = (byte)SomeEnum.SomeValue;
3个回答

15

其实没有太多意义,除非默认基本类型(int)不够用,即您想使用比它更高的整数值,则可以将其设置为long。当您拥有一个具有超过32个值的[Flags]枚举时,这可能很有用。

您可以将其设置为byteshort以限制值的范围,但是在用作局部变量时(即与int相同),实际上仍将占用4个字节。但是,如果用作数组,则可能占用更少的内存。


5
你有最后一部分的引用资料吗? - porges
14
对于单变量,最后一部分可能是正确的,这是由于填充所致。然而,我认为如果您有一个底层类型为字节的枚举的大型数组,那么这就像拥有一个byte[]而不是一个 int[] - Jon Skeet
是的,就像Jon Skeet所说的那样。但是谁会使用枚举数组呢? :) - EMP
12
@EMP:我需要做一件大事,这也是我在这里的原因! - mpen

4

来自枚举(C#参考)

底层类型指定为每个枚举器分配多少存储空间。 但是,需要显式转换才能从枚举类型转换为整数类型。


2
我猜我错过了那个有趣的小细节.. 哈哈 - Marlon

3
除了技术原因外,这里还有一个设计原则。
将枚举指定为具有字节存储是一种实现细节。使用枚举是不同的问题,您不应该知道或关心它的实现细节。
在客户端代码中,您使用枚举应该意味着您实际上要使用枚举,而不是字节或长整型等。否则,为什么不直接使用您需要的数据类型呢?
像C#这样的强类型语言努力使得超出您的编码“合同”变得更加困难,这通常有助于使应用程序设计更好一些。
当然,我并不是说没有时候你必须涉足实现细节,比如在对象关系映射器(ORM)中,您正在将C#数据类型映射到数据库数据类型,枚举是一个很好的例子,您需要知道它的存储类型来进行映射。但在这些情况下,明确转换或反射是个好标记,在审查中,这里您特别地迈出了通常使用的步骤。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接