应该枚举包含无吗?

时间:2013-02-07 19:58:10

标签: c# coding-style enums

我有时看到enum是这样的:

public enum Color {
    None, Black, Red, Blue
}

代码如下:

Color color;

...

if (color == Color.None) ...

我更喜欢使用可以为空的枚举,并将其编码为:

public enum Color {
    Black, Red, Blue
}

...

Color? color;

...

if (color == null) ...

首选哪种风格?

5 个答案:

答案 0 :(得分:9)

一如既往,这取决于。

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

那就是说,enum guidelines作为"开发类库的设计指南的一部分"包括:

  

在简单枚举上提供零值。

     

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

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

至于你是否应该使用可以为空的枚举 - 这实际上取决于具体情况。我使用Color?变量用于"可能有Color值,或者可能没有"因为None确实不是一种明智的颜色。 {em>不 None意味着Enum.IsDefined(typeof(Color))更有用,IMO。为什么枚举与任何其他非可空值类型不同?您通常不会使用0表示"我们没有任何信息" - 您使用int?代替。我建议以符合您int的方式处理枚举。

(说完所有这些后,我发现我在Noda Time的None中添加了IsoDayOfWeek作为值,我觉得很惊讶,现在正在查看它。)

答案 1 :(得分:1)

这取决于您想要赋予None的含义。

null未知,null可以是任何颜色或没有颜色,但我们不知道颜色。
虽然没有声音,因为颜色已知:没有颜色。

所以..为你的应用选择正确的东西。

答案 2 :(得分:1)

我个人会避免像None这样的颜色。显然没有颜色,因此在语义上不正确。只要发生这种情况,你就会遇到麻烦。

E.g。试着想象一下Set可能的颜色。 [ White, Black, Red ]有道理,但显然[ White, Black, None ]没有。

null会更好,但您也可以尝试解决此问题,例如一个isPresent()方法或类似的东西。

答案 3 :(得分:0)

None超过nullNone使得猜测更加明显。您可以像这样使用它:colorObject.None。但这是主观的,并且基于品味。

没有color被称为“null”,但可能没有 - color(透明?)。

答案 4 :(得分:0)

如果它对你设置的颜色没有颜色的任何对象有效,我认为你应该选择None作为选项,否则请将其关闭。