Перечисления отлично подходят для легковесной информации о состоянии. Например, ваше перечисление цветов (исключая синий) подойдет для запроса состояния светофора. Истинный цвет вместе со всей концепцией цвета и всем его багажом (альфа, цветовое пространство и т. д.) не имеет значения, просто в каком состоянии находится свет. Кроме того, немного изменив ваше перечисление, чтобы представить состояние светофора :
[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;
}
Итак, если у вас есть перечисление и вы обнаружите, что постоянно выполняете переключатель/случай/если/иначе/что угодно для получения объекта, вы можете использовать статические члены класса. Если вы запрашиваете только состояние чего-либо, я бы придерживался перечислений. Кроме того, если вам приходится передавать данные небезопасным способом, перечисления, вероятно, выживут лучше, чем сериализованная версия вашего объекта.
Редактировать: @stakx, я думаю, вы тоже наткнулись на что-то важное, в ответ на сообщение @Anton, и это сложность или, что более важно, для кого это сложно?
С точки зрения потребителя я бы предпочел статические члены класса System.Drawing.Color, а не необходимость писать все это. Однако с точки зрения продюсера писать все это было бы мучением. Поэтому, если другие люди будут использовать ваш код, вы можете избавить их от многих проблем, используя статические члены класса, даже если вам потребуется в 10 раз больше времени для написания/тестирования/отладки. Однако, если это только вы, вам может быть проще просто использовать перечисления и приводить/преобразовывать по мере необходимости.
person
Community
schedule
22.01.2010