【问题标题】:should enum's contain None?枚举应该包含无吗?
【发布时间】:2013-02-07 19:58:09
【问题描述】:

我有时会看到这样的enums:

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

代码如下:

Color color;

...

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

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

public enum Color {
    Black, Red, Blue
}

...

Color? color;

...

if (color == null) ...

哪种风格更受欢迎?

【问题讨论】:

  • None 超过 nullNone 让人猜不透。
  • “我更喜欢使用可以为空的枚举”......不是一个聪明人,但听起来你回答了你自己的问题。答案取决于枚举背后的意图。如果它有时应该为 NULL,则使其可为空。如果它永远不应为 NULL,请添加“无”选项。
  • 通常是第一个。它使调试更容易,而且nullColor.None 不同。
  • @JoelFan 但是将color设置为null等于说不适用,设置为Color.None则说此时没有颜色。跨度>
  • @SebastianMach 对于可怕的 Null Ref 异常,我倾向于避免使用空值。 Null 在编程中有其特殊的位置,但我倾向于尽可能减少它们并使用 Null Object 模式。我想这是品味和选择的问题。

标签: c# coding-style enums


【解决方案1】:

一如既往,视情况而定。

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

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

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

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

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

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

(说了这么多,我发现我在野田时间的IsoDayOfWeek 中包含了None 作为一个值,我现在看着它感到惊讶。)

【讨论】:

  • 我看不出 int 如何与 enum 相提并论。无法向 int 添加更多值,因此别无选择,只能使其可为空。使用枚举可以选择添加 None 值。顺便说一句,我见过很多代码,其中 int 中的 0 表示“没有信息”,我讨厌这样!
  • @JoelFan:通常你可以说“-1(或int.MinValue)不是这个变量的有效正常值,所以我们将其用作缺席值”——它只是丑陋的海事组织。
  • 如果我要利用可比性,我只会使用 int.MinValue ......即,如果我正在计算最大值,将其初始化为 int.MinValue 是有意义的
  • 我遇到的一个类似问题是是否使用 Nullable DateTime 或 DateTime.MinValue
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    这取决于你想赋予None什么含义。

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

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

    【讨论】:

    • null 是如何处理 所有其他类型 的任何其他值的缺失(因此对于 int,您可以使用 int? 作为变量这可能是“没有已知值”)。为什么要区别对待枚举?
    • 当您说您将NoneColor 类型的值)视为表示颜色不存在的值。这就像使用DateTime.MinValue 作为一个魔术值,例如DateTime 的null。
    • @JonSkeet,不,这意味着None == 透明或类似的东西,没有神奇的价值,只是没有颜色(如果它在现实生活中有意义,那就是另一个问题。)
    • 我将“透明”视为“不是颜色”——这就是这里的区别。我不希望它作为枚举的一部分。在这里,颜色可能是一个不幸的例子。
    • @JonSkeet,现在我明白了。是的,颜色确实不是一个很好的例子。
    【解决方案4】:

    None 超过 nullNone 让人猜不透。你可以像这样使用它:colorObject.None。但这是主观的,并基于口味。

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

    【讨论】:

    • “无颜色”的概念在物理上与“零颜色”一样合理。即使在表面上没有感知到颜色,仍然有光子在传播,可见光谱之外是否“没有”颜色是人眼无法判断的。此外,nullnilnul 和所有其他形式都得到广泛认可,意思是“没有指针/目标/值”。
    • 此外,这不仅仅关乎品味,如理解nullnone,还关乎强制责任和更糟糕的异常安全程度/更糟在所有使用该类型的代码上添加样式。例如,责任:所有代码都必须检查 none。例如,异常安全:否则不会抛出异常的代码现在必须在 None 的情况下抛出异常,或回退到默认值,或减少后置条件保证(例如,必须使用 returns the grayscale counterpart of Color x 而不是 returns the grayscale counterpart of Color x, or None if x==None) .
    【解决方案5】:

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

    【讨论】:

    • 假设没有颜色是有效的。如果我应该用 None 或 null 处理它,请回答这个问题
    • 由于对象没有颜色是有效的,因此我将 None 作为选项。
    猜你喜欢
    • 2022-01-13
    • 2010-10-07
    • 2016-08-21
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2021-06-06
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多