【发布时间】:2014-07-31 19:51:53
【问题描述】:
在 C# 中创建新枚举时,拥有 null 成员是一种好习惯吗?
如果是,你是否给它默认值0?你会称空成员为 Null 还是 NULL?您是否严格相信 Null,或者将其称为 null 以外的其他名称没有任何问题。例如无。你能详细说明你的答案吗?
【问题讨论】:
在 C# 中创建新枚举时,拥有 null 成员是一种好习惯吗?
如果是,你是否给它默认值0?你会称空成员为 Null 还是 NULL?您是否严格相信 Null,或者将其称为 null 以外的其他名称没有任何问题。例如无。你能详细说明你的答案吗?
【问题讨论】:
更新:关于链接副本的广泛接受的答案倾向于使用可为空的类型,而不是定义“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 时。
【讨论】:
Framework Design Guidelines 建议您应该:
务必在简单枚举上提供零值。
考虑将值称为“无”。如果这样的值不适用于此特定枚举,则应为枚举最常见的默认值分配基础值零。
例子:
public enum Compression {
None = 0,
GZip,
Deflate
}
他们还建议不要使用像 First 和 Last 这样的标记值,因为它们会让用户感到困惑。
这些只是指导方针,可能存在超越此建议的竞争性问题,例如与现有库或使用模式的兼容性。
【讨论】: