Помечать перечисления атрибутом FlagsAttribute
Обновлен: Ноябрь 2007
TypeName |
MarkEnumsWithFlags |
CheckId |
CA1027 |
Категория |
Microsoft.Design |
Критическое изменение |
Не критическое |
Причина
Значения открытого перечисления являются степенями двух или сочетаниями других значений, определенных в перечислении, а атрибут System.FlagsAttribute отсутствует. Для сокращения количества ложных положительных результатов данное правило не сообщает о нарушениях для перечислений с непрерывными значениями.
Описание правила
Перечисление является типом значения, которое определяет набор связанных именованных констант. FlagsAttribute применяется к перечислению, когда его именованные константы могут быть целенаправленно объединены. Например, рассмотрим перечисление дней недели в приложении, предназначенном для отслеживания доступности ресурсов определенного дня. Если для кодирования доступности каждого ресурса использовалось перечисление с атрибутом FlagsAttribute, могут быть представлены все сочетания дней. Без данного атрибута можно представить только один день недели.
В полях, где хранятся комбинируемые перечисления, отдельные значения перечислений обрабатываются как группы битов. Поэтому такие поля иногда называются битовыми. Для объединения значений перечисления для хранения в битовом поле следует использовать логические условные операторы. Для проверки битового поля на наличие конкретного значения перечисления следует использовать логические операторы. Для надлежащего хранения комбинируемых значений перечисления в битовом поле и извлечения их из него каждое значение, определенное в перечислении, должно быть степенью двух. До тех пор, пока не будет выполнено это условие, извлечь хранящиеся в этом поле отдельные значения перечисления с помощью логических операторов будет невозможно.
Устранение нарушений
Чтобы устранить нарушение данного правила, добавьте в перечисление атрибут FlagsAttribute.
Отключение предупреждений
Если значения перечисления не должны быть комбинируемыми, вывод предупреждения для данного правила можно отключить.
Пример
В следующем примере DaysEnumNeedsFlags является перечислением, которое соответствует требованиям для использования атрибута FlagsAttribute, но не имеет его. В перечислении ColorEnumShouldNotHaveFlag отсутствуют значения, являющиеся степенями двух, коме того, оно неправильно задает FlagsAttribute. Это является нарушением правила Не помечать перечисления атрибутом 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
}
}
Связанные правила
Не помечать перечисления атрибутом FlagsAttribute