【问题标题】:Is it a good practice to add a "Null" or "None" member to the enum? [duplicate]在枚举中添加“Null”或“None”成员是一种好习惯吗? [复制]
【发布时间】:2014-07-31 19:51:53
【问题描述】:

在 C# 中创建新枚举时,拥有 null 成员是一种好习惯吗?

如果是,你是否给它默认值0?你会称空成员为 Null 还是 NULL?您是否严格相信 Null,或者将其称为 null 以外的其他名称没有任何问题。例如无。你能详细说明你的答案吗?

【问题讨论】:

标签: c# .net enums null


【解决方案1】:

更新:关于链接副本的广泛接受的答案倾向于使用可为空的类型,而不是定义“null”/“none”/0 成员。下面描述的 FxCop 规则在 Nullable 类型之前就已经存在。

所以而不是:

var myEnum = SomeEnumType.None;

您可以使用 Nullable 值类型将其定义为 null

SomeEnumType? myEnum = null;

我仍然认为[Flags] 枚举的None 成员可能很有用。


上一个答案:

Visual Studio 中有一条设计规则CA1008,可以帮助您深入了解您的问题。规则的描述是(我的样式):

与其他值类型一样,未初始化枚举的默认值为零。 一个非标志属性的枚举应该定义一个具有零值的成员,以便默认值是枚举的有效值。 如果合适,将成员命名为“无”。否则,将零分配给最常用的成员。 注意,默认情况下,如果第一个枚举成员的值没有在声明中设置,则其值为0。

如果应用了FlagsAttribute 的枚举定义了一个零值成员,则其名称应为“None”,以指示未在枚举中设置任何值。 将零值成员用于任何其他目的与 FlagsAttribute 的使用相反,因为 AND 和 OR 位运算符对成员无用。 这意味着应该只分配一个成员值为零。请注意,如果在标志属性枚举中出现多个值为 0 的成员,Enum.ToString() 会为不为零的成员返回不正确的结果。

还有一篇Enum Design的文章提出了以下几点:

  • DO 在简单枚举上提供零值。考虑将值称为“无”。如果此类值不适用于此特定枚举,则应为该枚举最常见的默认值分配基础值零。
  • X AVOID 使用标志枚举值为零,除非该值表示“所有标志都已清除”并且按照下一个指南的规定适当命名。
  • DO 将标志枚举的零值命名为None。对于标志枚举,该值必须始终表示“所有标志都已清除”。

基于上述情况,我会说是的,这是一种很好的做法,尤其是当您拥有[Flags] enum 时。

【讨论】:

  • 我刚刚更新了 NuGet 包,现在我得到了一个 CA1069 - 枚举不应该有重复的值。具体来说,错误消息显示“枚举成员 'None' 与成员 'None' 具有相同的常量值 '0'。现在是否有某种 None 被烘焙到底层枚举类型中?
  • 两分钟后:我看到了,我评论了它……现在警告消失了。 Visual Studio 2019 和/或能发挥 FxCop 魔力的 NuGet 包中的一些奇怪的东西......
【解决方案2】:

Framework Design Guidelines 建议您应该:

务必在简单枚举上提供零值。
考虑将值称为“无”。如果这样的值不适用于此特定枚举,则应为枚举最常见的默认值分配基础值零。

例子:

 public enum Compression {
      None = 0,
      GZip,
      Deflate
 }

他们还建议不要使用像 First 和 Last 这样的标记值,因为它们会让用户感到困惑。

这些只是指导方针,可能存在超越此建议的竞争性问题,例如与现有库或使用模式的兼容性。

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 2013-08-03
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2017-07-15
    • 2015-01-08
    相关资源
    最近更新 更多