Поделиться через


Разработка перечислений

Обновлен: Ноябрь 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.

См. также

Основные понятия

Разработка перечислений флагов

Добавление значений в перечисления

Другие ресурсы

Правила разработки типов

Руководство по разработке библиотек классов