枚举对于轻量级状态信息非常有用。例如,您的颜色枚举(不包括蓝色)非常适合查询交通灯的状态。真实的颜色以及颜色的整个概念及其所有包袱(alpha、颜色空间等)并不重要,重要的是灯处于哪个状态。另外,稍微改变你的枚举来表示交通灯的状态:
[Flags()]
public enum LightColors
{
unknown = 0,
red = 1,
yellow = 2,
green = 4,
green_arrow = 8
}
当前灯光状态可以设置为:
LightColors c = LightColors.red | LightColors.green_arrow;
并查询为:
if ((c & LightColors.red) == LightColors.red)
{
//Don't drive
}
else if ((c & LightColors.green_arrow) == LightColors.green_arrow)
{
//Turn
}
静态类颜色成员将能够支持这种多重状态,而无需额外的功能。
然而,静态类成员对于常用对象来说非常有用。这System.Drawing.Color
成员是很好的例子,因为它们代表了具有模糊构造函数的已知颜色(除非您知道十六进制颜色)。如果它们被实现为枚举,那么每次您想要使用该值作为颜色时,您都必须执行类似的操作:
colors c = colors.red;
switch (c)
{
case colors.red:
return System.Drawing.Color.FromArgb(255, 0, 0);
break;
case colors.green:
return System.Drawing.Color.FromArgb(0,255,0);
break;
}
因此,如果您有一个枚举并发现您不断执行 switch/case/if/else/无论什么来派生对象,您可能需要使用静态类成员。如果您只是查询某物的状态,我会坚持使用枚举。另外,如果您必须以不安全的方式传递数据,则枚举可能比对象的序列化版本更好地生存。
Edit:@stakx,我认为你在回应@Anton的帖子时也偶然发现了一些重要的东西,那就是复杂性或更重要的是,它对谁来说是复杂的?
从消费者的角度来看,我非常喜欢 System.Drawing.Color 静态类成员,而不是必须编写所有这些。然而,从制片人的角度来看,必须编写所有这些内容将是一件痛苦的事情。因此,如果其他人要使用您的代码,您可能会通过使用静态类成员为他们节省很多麻烦,即使您可能需要花费 10 倍的时间来编写/测试/调试。但是,如果只有您,您可能会发现根据需要使用枚举和转换/转换会更容易。