Разработка перечислений
Обновлен: Ноябрь 2007
Перечисления предоставляют набор постоянных значений, которые применяются для строго типизированных членов и повышают удобочитаемость кода. Перечисления могут быть либо простыми, либо флаговыми. Простые перечисления содержат значения, которые не комбинируются и не используются в побитовых операциях сравнения. Флаговые перечисления предназначены для комбинирования при помощи побитовых операций OR. Комбинации значений флаговых перечислений проверяются с использованием побитовых операций AND.
В приведенных ниже рекомендациях приводятся оптимальные методы разработки перечислений.
Используйте перечисления для строго типизированных параметров, свойств и возвращаемых значений, которые представляют собой наборы значений.
Предпочтительнее использовать перечисления, а не статические константы.
В следующем примере кода демонстрируется неверный подход.
Public Class BadFurnishings
Public Shared Table As Integer = 1
Public Shared Chair As Integer = 2
Public Shared Lamp As Integer = 3
End Class
public static class BadFurnishings
{
public static int Table = 1;
public static int Chair = 2;
public static int Lamp = 3;
}
В следующем примере кода показано перечисление, которое следует использовать вместо статических констант.
Public Enum GoodFurnishings
Table
Chair
Lamp
End Enum
public enum GoodFurnishings
{
Table,
Chair,
Lamp
}
Не используйте перечисление для открытых наборов, таких как версия операционной системы.
Добавление значений в уже поставленное перечисление может привести к неработоспособности существующего кода. Иногда это может быть приемлемо, но при наличии подобных проблем разработка перечислений нецелесообразна.
Не определяйте зарезервированные значения перечислений, которые предполагается использовать в будущем.
В некоторых ситуациях может оказаться, что необходимо добавить значения к поставленному перечислению, несмотря на риск возникновения неработоспособности существующего кода. Можно также определить новое перечисление и члены, которые работают с его значениями.
Избегайте перечислений с открытым доступом, содержащих только одно значение.
Не включайте в перечисления значения-метки.
Значения-метки используются для определения границ значений перечисления. Обычно значение-метка используется при проверке диапазонов и не является допустимым значением данных. В следующем примере кода определяется перечисление, в котором используется значение-метка.
Public Enum Furniture
Desk
Chair
Lamp
Rug
LastValue
End Enum
public enum Furniture
{
Desk,
Chair,
Lamp,
Rug,
LastValue // The sentinel value.
}
Включайте нулевое значение в простые перечисления.
По возможности называйте это значение None. Если None не подходит, назначьте значение "ноль" наиболее часто используемому значению (по умолчанию).
Рекомендуется использовать тип "System.Int32" (тип данных по умолчанию в большинстве языков программирования) в качестве базового типа данных перечисления. Однако если выполняется одно из перечисленных ниже условий, следует использовать другой тип данных.
Перечисление является флаговым и содержит более 32 флагов, или планируется расширение перечисления в будущем.
Базовый тип должен отличаться от Int32 для более простого взаимодействия с неуправляемым кодом, если планируется использование перечислений другого размера.
Базовый тип меньшего размера приведет к существенной экономии памяти. Если перечисление планируется использовать, в основном, в качестве аргумента для потока управления, размер имеет небольшое значение. Экономия памяти за счет размера может быть важна, если:
планируется использовать перечисление в качестве поля в структуре или классе, экземпляры которых очень часто создаются;
планируется, что пользователи будут создавать большие массивы или коллекции экземпляров перечислений;
планируется сериализация большого числа экземпляров перечислений.
Называйте флаговые перечисления с использованием существительных во множественном числе или фраз на основе существительных. Простые перечисления следует называть с использованием существительных в единственном числе или фраз на основе существительных.
Не расширяйте непосредственно класс System.Enum.
Некоторые компиляторы не позволяют расширять Enum, если только это не делается косвенным путем с использованием ключевого слова для создания перечислений, зарезервированного в языке программирования.
Фрагменты — © Корпорация Майкрософт (Microsoft Corp.), 2005. Все права защищены.
Фрагменты — © Addison-Wesley Corporation. Все права защищены.
Дополнительные сведения о рекомендациях по разработке см. в книге "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries", Krzysztof Cwalina and Brad Abrams, Addison-Wesley, 2005.
См. также
Основные понятия
Разработка перечислений флагов
Добавление значений в перечисления