添加" Null"是一个好习惯吗?或"无"成员到枚举?

时间:2014-06-10 21:43:24

标签: c# .net enums null

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

如果是,默认情况下你给它的值是0吗?你会调用null成员Null还是NULL?你是否严格相信Null,或者你在调用null以外的东西时没有任何问题。例如无。你能详细说明你的答案吗?

2 个答案:

答案 0 :(得分:16)

Visual Studio中有一个设计规则CA1008,可以提供对您的问题的一些了解。规则的描述是(造型我的):

  

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

     

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

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

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

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

答案 1 :(得分:2)

Framework Design Guidelines建议您:

  

DO 在简单枚举上提供零值   考虑调用类似"无"的值。如果这样的值不适合此特定枚举,则应为枚举的最常见默认值指定基础值为零。

示例:

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

他们还建议不要使用诸如First和Last之类的Sentinal值,因为它们会让用户感到困惑。

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