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

Битовое перечисление используется для маскирования битовых полей и выполнения битовых сравнений. При корректном дизайне они используются для задания множественных перечислимых значений за один раз. Например, можно комбинировать любые из перечислимых значений GenericUriParserOptions для конфигурации базового синтаксического анализатора Uniform Resource Identifier (URI).

Используйте System.FlagsAttribute для битовых перечислений. Не применяйте этот атрибут для простых перечислений.

Используйте степень числа 2 для значений битовых перечислений, так чтобы их можно было свободно комбинировать с использованием битовой операции OR.

Важное примечаниеВажно

Если Вы не используете степень числа 2 или комбинации степеней числа 2, битовые операции не выполняются, как предусмотрено.

Для наиболее используемых комбинаций битов следует рассмотреть возможность создания специальных значений перечислений.

Комбинирование значений битовых перечислений — это средний уровень мастерства, который не следует требовать от разработчиков обычных сценариев. Например, перечисление FileShare содержит значение ReadWrite для указания того, что разделяемый файл может быть открыт для чтения или записи. Это показывает разработчикам, что они могут открыть разделяемый файл для чтения или записи, и исключает необходимость комбинирования значений перечислений из отдельных значений.

Избегайте создания битовых перечислений, когда определенные комбинации значений недопустимы.

Эта проблема обычно указывает на то, что смысл перечисления недостаточно определен. Следует рассмотреть возможность разделения перечисления на два или более перечисления, в каждом из которых будет более определенный набор значений. Например, рассмотрим следующее плохо определенное перечисление.

<Flags()> _
Public Enum PurchaseTypes

    SalePrice
    RegularPrice
    Book
    CompactDisk

End Enum

[Flags]
public enum PurchaseTypes
{
    SalePrice,
    RegularPrice,
    Book,
    CompactDisk
}

Разработчик намеревается использовать это перечисление со следующим методом.

Public Overloads Function FindPriceForItem(ByVal title As String, ByVal purchase As PurchaseTypes) As Single
    Return 0
End Function
public float FindPriceForItem(string title, PurchaseTypes purchase)

При вызове этого метода параметр purchase определяет точно одно из значений — SalePrice или RegularPrice и точно одно из значений — Book или CompactDisk. Разработчики не будут иметь возможность определить это требование без изучения документации или экспериментирования с методом. Лучшим подходом является отделение двух видов информации и размещение их в собственные перечисления, как показано в следующем примере кода программы.

Public Enum ItemType

    Book
    CompactDisk

End Enum

Public Enum PriceType

    SalePrice
    RegularPrice

End Enum

public enum ItemType
{
    Book,
    CompactDisk
}

public enum PriceType
{
    SalePrice,
    RegularPrice,
}

Сигнатура метода теперь изменится в соответствии с этим разделением, как показано в следующем примере кода программы.

Public Overloads Function FindPriceForItem(ByVal title As String, ByVal name As ItemType, ByVal price As PriceType) As Single
    Return 0
End Function
public float FindPriceForItem(string title, ItemType name, PriceType price)

Избегайте установки значения битовых перечислений на ноль, если только это значение не используется для указания того, что все биты очищены. Такое значение должно иметь соответствующее имя, как описано в следующем правиле.

Обратите внимание, что это правило касается только битовых перечислений. Простые перечисления могут и должны использовать нулевое значение.

Назовите нулевое значение битовых перечислений None. Для битовых перечислений это значение всегда должно означать, что все биты очищены.

Важное примечаниеВажно

Не используйте в битовом перечислении значение ноль для указания на другое состояние.Не существует способа проверки явной установки бита нулевого значения, в отличие от состояния, когда все биты очищены.

Охраняется авторским правом Copyright 2005 Microsoft Corporation. Все права защищены.

Фрагменты — © Addison-Wesley Corporation. Все права защищены.

Для дополнительной информации о разработке руководящих принципов, смотрите "руководства по разработке рамок: Конвенций, идиомы и шаблоны для повторного использования.NET библиотек"книга, Кшиштоф Cwalina и Брэд Абрамс, опубликованных Addison-Wesley, 2005 года.

См. также

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

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

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

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

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

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