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


CA1027: следует помечать перечисления атрибутом FlagsAttribute

TypeName

MarkEnumsWithFlags

CheckId

CA1027

Категория

Microsoft.Design

Критическое изменение

Не критическое

Причина

Значения открытого перечисления являются степенями двух или сочетаниями других значений, определенных в перечислении, а атрибут System.FlagsAttribute отсутствует. Для сокращения количества ложных положительных результатов данное правило не сообщает о нарушениях для перечислений с непрерывными значениями.

Описание правила

Перечисление является типом значения, которое определяет набор связанных именованных констант. FlagsAttribute применяется к перечислению, когда его именованные константы могут быть целенаправленно объединены. Например, рассмотрим перечисление дней недели в приложении, предназначенном для отслеживания доступности ресурсов определенного дня. Если для кодирования доступности каждого ресурса использовалось перечисление с атрибутом FlagsAttribute, могут быть представлены все сочетания дней. Без данного атрибута можно представить только один день недели.

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

Устранение нарушений

Чтобы устранить нарушение данного правила, добавьте в перечисление атрибут FlagsAttribute.

Отключение предупреждений

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

Пример

В следующем примере DaysEnumNeedsFlags является перечислением, которое соответствует требованиям для использования атрибута FlagsAttribute, но не имеет его. В перечислении ColorEnumShouldNotHaveFlag отсутствуют значения, являющиеся степенями двух, коме того, оно неправильно задает FlagsAttribute. Это является нарушением правила CA2217: не следует помечать перечисления атрибутом FlagsAttribute.

using System;

namespace DesignLibrary
{
// Violates rule: MarkEnumsWithFlags.

   public enum DaysEnumNeedsFlags 
   {
      None        = 0,
      Monday      = 1,
      Tuesday     = 2,
      Wednesday   = 4,
      Thursday    = 8,
      Friday      = 16,
      All         = Monday| Tuesday | Wednesday | Thursday | Friday
   }
   // Violates rule: DoNotMarkEnumsWithFlags.
   [FlagsAttribute]
   public enum ColorEnumShouldNotHaveFlag 
   {
      None        = 0,
      Red         = 1,
      Orange      = 3,
      Yellow      = 4
   }
}

Связанные правила

CA2217: не следует помечать перечисления атрибутом FlagsAttribute

См. также

Ссылки

System.FlagsAttribute