我有时看到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) ...
首选哪种风格?
答案 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
超过null
。 None
使得猜测更加明显。您可以像这样使用它:colorObject.None
。但这是主观的,并且基于品味。
没有color
被称为“null”,但可能没有 - color
(透明?)。
答案 4 :(得分:0)
如果它对你设置的颜色没有颜色的任何对象有效,我认为你应该选择None作为选项,否则请将其关闭。