【问题标题】:Pros and Cons explicitly setting enum field's values显式设置枚举字段值的优点和缺点
【发布时间】:2009-11-05 15:28:23
【问题描述】:

是否最好明确设置枚举的字段而不是仅仅定义它们的名称? 例如。 Enum1 与 Enum2 的优缺点?

枚举1:

enum SomeEnum
{
   Something1 = 0,
   Something2 = 1
}

枚举2:

enum SomeEnum
{
   Something1,
   Something2
}

附:此问题与将存储在数据库中的枚举无关,这需要显式设置值。

编辑: 假设所有值都是 0、1 等...它们不是负数。

【问题讨论】:

    标签: .net theory


    【解决方案1】:

    Enum1 和 Enum2 编译为相同的枚举。所以从编程的角度来看,没有区别。从维护的角度来看,可能存在也可能不存在问题。

    一方面,[Flags] 枚举绝对需要声明显式值;并且它们必须是 2 次方的值。

    另一方面,显式值可以通过创建将来不能或不应更改的值来降低可维护性。

    一般来说,我宁愿不声明显式值,除非值本身由于某种原因很重要——例如,如果您的 C# 枚举是包装 C 枚举。

    【讨论】:

    • 我问这个问题主要是出于可用性和可维护性的原因,所以这个答案是最接近的。谢谢。
    • 从技术上讲,标志可以通过将它们定义为Val1=1, Val2=Val1<<1, Val3=Val2<<1, 等来“自动化”。可以方便地添加值(甚至是中间值),而无需担心计算它们。
    【解决方案2】:

    当你需要负值时很有用

    enum
    {
      Error = -1,
      Success = 0,
      Something1, 
      Something2,
    };
    

    【讨论】:

    • 负值不​​会向枚举添加任何内容。
    • @Randolpho: enum.s 经常用于包装其他应用程序的 API。例如:围绕 Google 数据 API 的 C#/.NET 包装器。如果您可以枚举所有返回值,包括发起者决定使用的否定值,它会增加很多。
    • @Dinah:我知道这一点(请参阅我在此页面上的回答)。对于包装旧的 C API,是的,经常需要枚举的负值。但我坚持我的说法:枚举中的负值没有提供真正的价值。在 C 时代也是如此。仍然如此。
    【解决方案3】:

    如果您需要不连续的值,您可以使用 Enum1。

    enum Colors 
    { 
        Red = 1, 
        Green = 2, 
        Blue = 4, 
        Yellow = 8 
    };
    

    此外,显式设置数字更易于阅读,并且在中间添加一个值不会更改任何其他值。

    【讨论】:

    • 嗨罗伯特,“在中间添加一个值不会改变任何其他值”是什么意思
    • 如果他在中间加上 Purple = 3,它不会改变 Blue 或 Yellow 的值。
    • 是的,但将其添加到末尾也不会影响值!?
    • 嗨罗伯特,我不是说你错了! OP询问这两种方法的原因是什么。除了想知道 Red 等于 1,还有其他原因吗?
    • 嗯,我不明白你在说什么 - 但是当它们在编码时通过智能感知按字母顺序显示时,我仍然看不到原因。
    【解决方案4】:

    如果值在您的程序之外具有某些含义,则显式设置值很有用。例如,应用程序可能会编写一个使用 Severity 值的日志文件,您可以稍后使用该值过滤该日志文件。在 Enum 中显式设置值意味着您可以在代码中使用 Enum(例如,Critical、Error、Warning)而不是数值。在日志文件中,您可能希望写入数值以便于排序。

    我还看到了一个用于表示数据库引用表中的值的枚举。在这种情况下,您要确保枚举中的项目始终与数据库表具有相同的值,并且在枚举中间插入新项目不会弄乱值。

    【讨论】:

      【解决方案5】:

      如果您确实需要数字,请使用示例 1(即您需要知道 something2 实际上等于 2)

      对于所有其他选项,请勿使用数字。这样,您就可以愉快地向您的枚举添加额外的项目,而不会破坏任何其他可能引用您的枚举的代码。

      【讨论】:

      • 那就来吧......这个答案显然没有用?但为什么呢?
      • 投反对票可能是因为您的陈述“不破坏任何代码”并非 100% 正确。如果在计算中使用了枚举值,并且该枚举值发生了变化,则代码将中断。
      • @Robert:好吧,他确实说的是“添加”而不是“更改”......我看不出 -1 和补偿的原因。
      • 添加 == 如果您在中间添加一个值且未明确说明值,则更改。
      【解决方案6】:

      在通过 Web 服务接口使用不包含值 0 的枚举时,我遇到了序列化枚举的问题。

      【讨论】:

      • 只要使用[EnumMember(Value = "EnumerantValue")]
      • 不像写的那样,但它确实像这样工作:<EnumMember(Value:="EnumerantValue")>
      【解决方案7】:

      这取决于你用枚举做什么。如果您将它们与 [Flags] 一起使用,那么您必须明确设置它们。如果你不是,那么从编码的角度来看,任何一种方式都有效。但是,为了可读性或(如前所述)在数据库情况下使用,您应该显式设置它们。另一个考虑因素是工作场所的编码标准,以及序列化。

      【讨论】:

        【解决方案8】:

        当您需要使用标记的枚举时,也需要枚举 1:http://weblogs.asp.net/wim/archive/2004/04/07/109095.aspx

        【讨论】:

          【解决方案9】:

          如果您只需要一组值不重要的类似 int 的常量,请使用默认值。如果值很重要,请设置它们。

          一个重要的值的例子是为位标志创建值,可以这样设置:

          > enum 
          {
              flag1 = 1;
              flag2 = 2;
              flag3 = 4;
          };
          
          func1(flag1 | flag3);
          

          【讨论】:

          • 您遗漏了[Flags] 属性。很有必要。
          【解决方案10】:

          还要考虑整数支持的枚举如果没有设置它们的值,那么它们的默认值将是 default(int)(或零),因此当使用隐式编号的枚举时,可能很难区分枚举值 未设置来自枚举值故意设置为第一个选项。这可能是为您的枚举值显式分配整数值的一个很好的论据,其起始整数不是零。当然,除非您将第一个值设为“未分配”或类似的值。

          【讨论】:

            猜你喜欢
            • 2011-01-20
            • 2010-09-18
            • 2012-10-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-02
            • 1970-01-01
            相关资源
            最近更新 更多