3

我有时会看到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) ...

哪种风格更受欢迎?

4

5 回答 5

12

一如既往,这取决于。

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

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

请在简单枚举上提供零值。

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

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

至于是否应该使用可为空的枚举 - 这真的取决于情况。我使用一个Color?变量来表示“可能有一个Color值,或者可能没有”,因为它None真的不是一种明智的颜色。IMO ,没有None意味着Enum.IsDefined(typeof(Color))更有用。为什么枚举与任何其他不可为空的值类型不同?您通常不会使用 0 来表示“我们没有任何信息”——int?而是使用 an 。我建议以与您对待的方式一致的方式对待枚举int

(说了这么多,我发现我在 Noda Time 中包含None了一个值IsoDayOfWeek,我觉得很惊讶,现在看着它。)

于 2013-02-07T19:59:50.167 回答
2

我个人会避免像None颜色这样的东西。None 显然不是一种颜色,因此它在语义上是不正确的。每当发生这种情况时,您就会遇到麻烦。

例如,试着想象一种Set可能的颜色。[ White, Black, Red ]有道理,但显然[ White, Black, None ]没有。

null会更可取,尽管您也可以尝试解决该问题,例如isPresent()方法或类似的东西。

于 2013-02-08T00:09:13.053 回答
1

这取决于您要赋予的含义是什么None

null是未知的,null 可以是任何颜色或没有颜色,但我们不知道颜色。
虽然 None 听起来像已知的颜色:没有颜色。

所以..为您的应用程序选择正确的东西。

于 2013-02-07T19:59:49.930 回答
0

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

于 2013-02-07T20:27:24.820 回答
0

None结束nullNone让猜测变得更加明显。你可以像这样使用它:colorObject.None. 但这是主观的,基于品味。

没有color所谓的“null”,但可以有一个 no- color(透明的?)。

于 2013-02-07T20:00:05.203 回答