添加"Null"是个好习惯吗?或“;None"枚举的成员

本文关键字:quot None 枚举 成员 好习惯 Null 添加 | 更新日期: 2023-09-27 18:08:06

在c#中创建一个新的enum时,null成员是一个好的做法吗?

如果是,是否默认设置为0 ?你会调用null成员null还是null ?你是否严格相信Null,或者你对它的称呼不是Null没有任何问题。例如无。你能详细说明你的回答吗?

添加"Null"是个好习惯吗?或“;None"枚举的成员

UPDATE:关于链接副本的广泛接受的答案倾向于使用可空类型,而不是定义一个"null"/"none"/0成员。下面描述的FxCop规则在Nullable类型出现之前就存在了。

所以不是:

var myEnum = SomeEnumType.None;

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

SomeEnumType? myEnum = null;

我仍然认为[Flags]枚举中的None成员是有用的。


之前答:

Visual Studio中有一个设计规则,CA1008,它为您的问题提供了一些见解。规则的描述是(样式化我的):

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

如果一个应用了FlagsAttribute的枚举定义了一个零值成员,它的名字应该是'None',表示该枚举中没有设置任何值。将零值成员用于任何其他目的都与FlagsAttribute的使用相反,因为与和或位操作符对该成员不起作用。这意味着只能将一个成员赋值为0。注意,如果在一个带有标志属性的枚举中出现多个值为0的成员,则Enum.ToString()将为非0的成员返回不正确的结果。

还有一篇枚举设计的文章提出了以下几点:

  • DO在简单枚举上提供零值。考虑将值命名为"None."如果这个值不适合这个特定的枚举,那么该枚举最常见的默认值应该被赋值为基础值0。
  • X AVOID使用标记枚举值为零,除非该值表示"所有标记都被清除";并按下一指南的规定适当命名。
  • DO将标志枚举的零值命名为None。对于标志枚举,该值必须总是表示"所有标志都被清除"。

基于以上,我想说是的,这是一个很好的做法,特别是当你有一个[Flags] enum

框架设计指南建议:

DO在简单枚举上提供0值。
考虑将该值命名为"None"。如果该值不适合此特定枚举,则应将该枚举最常见的默认值赋给基础值0。

的例子:

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

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

这些只是指导方针,可能会有相互竞争的问题覆盖这些建议,如与现有库或使用模式的兼容性。