应该枚举包含无吗?

Joe*_*Fan 3 c# enums coding-style

我有时看到过enum这样的事情:

public enum Color {
    None, Black, Red, Blue
}
Run Code Online (Sandbox Code Playgroud)

代码如下:

Color color;

...

if (color == Color.None) ...
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用可以为空的枚举并像这样编码:

public enum Color {
    Black, Red, Blue
}

...

Color? color;

...

if (color == null) ...
Run Code Online (Sandbox Code Playgroud)

哪种款式首选?

Jon*_*eet 10

一如既往,这取决于.

对于[Flags]枚举,None值几乎总是一个好主意,因为"这些选项中没有一个"是一个有用的概念.对于非[Flags]枚举,我通常不会包含None值,除非它显然在概念上有用.

也就是说,作为"开发类库的设计指南"的一部分,枚举指南包括:

在简单枚举上提供零值.

如果可能,请将此值命名为None.如果None不合适,请将值零分配给最常用的值(默认值).

...虽然示例不包含None,但.NET框架中的许多枚举也没有None值...

至于你是否应该使用可以为空的枚举 - 这实际上取决于具体情况.我使用一个Color?变量"可能有一个Color值,或者可能没有"因为None真的不是一个明智的颜色.具有None装置,其Enum.IsDefined(typeof(Color))是比较有用的,IMO.为什么枚举与任何其他非可空值类型不同?您通常不会使用0代表"我们没有任何信息" - 您可以使用int?代替.我建议以与你如何对待的方式对待enums int.

(说完了所有这些,我发现我在Noda Time中包含None了一个值IsoDayOfWeek,我觉得很惊讶,现在看着它.)