在C#中创建新的枚举时,拥有null成员是一个好习惯吗?
如果是,默认情况下你给它的值是0吗?你会调用null成员Null还是NULL?你是否严格相信Null,或者你在调用null以外的东西时没有任何问题。例如无。你能详细说明你的答案吗?
答案 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值,因为它们会让用户感到困惑。
这些只是指导原则,可能存在覆盖此建议的竞争问题,例如与现有库或使用模式的兼容性。