【问题标题】:What's the use-case for specifying the underlying type in enums?在枚举中指定基础类型的用例是什么?
【发布时间】:2011-02-08 16:23:58
【问题描述】:

拥有的意义何在

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

当您必须进行强制转换以将其分配给与枚举基础类型相同类型的变量时?

byte b = (byte)SomeEnum.SomeValue;

【问题讨论】:

    标签: c# types enums


    【解决方案1】:

    其实没什么意义,除非默认基础类型 (int) 对您来说不够用,即。如果您想使用比这更高的整数值,那么您可以将其设为long。当您的 [Flags] 枚举值超过 32 个时,这会很有用。

    您可以将其设为 byteshort 只是为了限制值的范围,但它实际上仍需要 4 个字节(即与 int 相同)。

    【讨论】:

    • 你对最后一部分有引用吗?
    • 对于单个变量,由于填充,最后一部分可能是正确的。但是,我相信如果您有一个带有底层字节类型的大型枚举数组,那就像拥有 byte[] 而不是 int[]
    • 是的,Jon Skeet 说的。但是到底谁会使用枚举数组呢? :)
    • @EMP:我也是……一个大的,这就是我在这里的原因!
    【解决方案2】:

    来自enum (C# Reference)

    底层类型指定了多少 为每个分配存储 枚举器。然而,一个明确的演员表 需要从枚举类型转换为 一个整数类型。

    【讨论】:

    • 我想我错过了那个有趣的小信息..哈哈
    【解决方案3】:

    除了技术原因...这里还有一个设计原则。

    将枚举指定为具有字节存储是一个实现细节。使用枚举是一个不同的问题,您不必知道或关心它的实现细节。

    在客户端代码中,您使用枚举的事实应该意味着您实际上是在使用枚举,而不是字节或长等。否则为什么不只使用您的意思的数据类型。

    诸如 C# 之类的强类型语言会努力让您更难以超越您的编码“合同”,这通常有助于使应用程序设计更好一点。

    当然,我并不是说您不必参与实现细节,一个很好的例子是对象关系映射器 (ORM),您将 C# 数据类型映射到数据库数据类型,枚举是一个很好的例子,你必须知道它的存储类型才能映射它。但在这些情况下,IMO 很好地必须明确地投射或反映,它在评论中是一个很好的标志,表明你在这里特别地超出了通常的用法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多