枚举类型非常适合轻量级的状态信息。例如,您的颜色枚举(不包括蓝色)可以用于查询交通灯的状态。真正的颜色以及颜色的整个概念和所有相关信息(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)
{
}
else if ((c & LightColors.green_arrow) == LightColors.green_arrow)
{
}
静态类颜色成员可以支持多种状态而不需要额外的功能。
然而,静态类成员非常适合常用对象。例如,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 等语句来派生出一个对象,那么你可能想要使用静态类成员。如果你只是查询某个东西的状态,我建议还是使用枚举类型。此外,如果你需要以不安全的方式传递数据,枚举类型可能比你的对象的序列化版本更能存活。
编辑:
@stakx,我认为你在回复 @Anton 的帖子时也碰到了一些重要的问题,那就是复杂性或者说,它对谁来说是复杂的?
从消费者的角度来看,我会非常喜欢 System.Drawing.Color 静态类成员,而不必编写所有这些内容。然而,从生产者的角度来看,编写所有这些内容可能会很麻烦。因此,如果其他人将使用您的代码,即使编写/测试/调试可能需要花费您10倍的时间,使用静态类成员可能会为他们节省很多麻烦。但是,如果只有你自己使用代码,你可能会发现使用枚举类型并根据需要进行强制转换更容易。