CA1027: следует помечать перечисления атрибутом FlagsAttribute
TypeName |
MarkEnumsWithFlags |
CheckId |
CA1027 |
Категория |
Microsoft.Design |
Критическое изменение |
Не критическое |
Причина
Значения открытого перечисления являются степенями двух или сочетаниями других значений, определенных в перечислении, а атрибут 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