CA1027: Marcar enumeraciones con FlagsAttribute
Nombre de tipo |
MarkEnumsWithFlags |
Identificador de comprobación |
CA1027 |
Categoría |
Microsoft.Design |
Cambio problemático |
Poco problemático |
Causa
Los valores de una enumeración pública son potencias de dos o combinaciones de otros valores definidos en la enumeración, pero el atributo System.FlagsAttribute no está presente. Para reducir los positivos falsos, esta regla no informa de una infracción para las enumeraciones que tienen valores contiguos.
Descripción de la regla
Una enumeración es un tipo de valor que define un conjunto de constantes con nombre relacionadas. Aplique FlagsAttribute a una enumeración cuando se pueden combinar con sentido sus constantes con nombre. Por ejemplo, tenga en cuenta una enumeración de los días de la semana en una aplicación que realiza el seguimiento de qué recursos del día hay disponibles. Si la disponibilidad de cada recurso se codifica utilizando la enumeración con FlagsAttribute presente, se puede representar cualquier combinación de días. Sin el atributo, sólo se puede representar uno día de la semana.
Para campos que almacenan las enumeraciones combinables, los valores de enumeración individuales se tratan como grupos de bits en el campo. Por consiguiente, a veces se les denomina campos de bits. Para combinar los valores de enumeración para el almacenamiento en un campo de bits, utilice los operadores condicionales de tipo Boolean. Para probar un campo de bits para determinar si un valor de enumeración concreto está presente, utilice los operadores lógicos de tipo Boolean. Para almacenar un campo de bits y recuperar correctamente los valores de enumeración combinados, cada valor definido en la enumeración debe ser una potencia de dos. A menos que esto sea así, los operadores lógicos de tipo Boolean no podrán extraer los valores de enumeración individuales almacenados en el campo.
Cómo corregir infracciones
Para corregir una infracción de esta regla, agregue FlagsAttribute a la enumeración.
Cuándo suprimir advertencias
Suprima una advertencia de esta regla si no desea que los valores de enumeración sean combinables.
Ejemplo
En el ejemplo siguiente, DaysEnumNeedsFlags es una enumeración que cumple los requisitos para utilizar FlagsAttribute, pero no lo tiene. La enumeración ColorEnumShouldNotHaveFlag no tiene valores que sean potencias de dos, y especifica FlagsAttribute incorrectamente. Esto infringe la regla CA2217: No marcar enumeraciones con 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
}
}
Reglas relacionadas
CA2217: No marcar enumeraciones con FlagsAttribute