Перечисления отлично подходят для облегченной информации о состоянии. Например, ваш цветовой список (исключая синий) будет полезен для запроса состояния светофора. Реальный цвет вместе со всей концепцией цвета и всем его багажом (альфа, цветовое пространство и т. Д.) Не имеет значения, просто в каком состоянии находится свет. Кроме того, немного измените свой enum, чтобы представить состояние светофора :
[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
}
Цветовые члены статического класса смогут поддерживать это множественное состояние без дополнительной функциональности.
Однако члены класса static прекрасно подходят для часто используемых объектов. 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;
}
Так что, если у вас есть enum и вы обнаружите, что вы постоянно делаете переключатель / case / if / else / что угодно для получения объекта, вы можете использовать статические члены класса. Если вы только запрашиваете состояние, я бы придерживался перечислений. Кроме того, если вам придется передавать данные небезопасным способом, перечисления, вероятно, выживут лучше, чем сериализованная версия вашего объекта.
Edit:
@stakx, я думаю, что вы наткнулись на что-то важное, тоже в ответ на сообщение @ Антона, и это сложность или, что более важно, для кого это сложно?
С точки зрения потребителя, я бы предпочел статические члены класса System.Drawing.Color, а не писать все это. Однако с точки зрения продюсера было бы больно писать все это. Так что, если другие люди будут использовать ваш код, вы можете избавить их от многих проблем, используя статические члены класса, даже если для написания / тестирования / отладки вам понадобится в 10 раз больше времени. Однако, если это только вы, вам может быть проще использовать перечисления и преобразовывать / преобразовывать по мере необходимости.