Freigeben über


CA1027: Enumerationen mit FlagsAttribute markieren

TypeName

MarkEnumsWithFlags

CheckId

CA1027

Kategorie

Microsoft.Design

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Die Werte einer öffentlichen Enumeration sind Potenzen von 2 oder Kombinationen anderer in der Enumeration definierter Werte. Das System.FlagsAttribute-Attribut ist nicht vorhanden. Damit weniger falsche Positiva produziert werden, meldet diese Regel keinen Verstoß bei Enumerationen mit fortlaufenden Werten.

Regelbeschreibung

Eine Enumeration ist ein Werttyp, der einen Satz verwandter benannter Konstanten definiert. Wenden Sie FlagsAttribute auf eine Enumeration an, wenn deren benannte Konstanten sinnvoll kombiniert werden können. Betrachten Sie z. B. eine Enumeration der Wochentage in einer Anwendung, die erfasst, welche Tagesressourcen verfügbar sind. Wenn die Verfügbarkeit jeder Ressource mithilfe der Enumeration codiert wird, die FlagsAttribute besitzt, kann eine beliebige Kombination von Tagen dargestellt werden. Ohne das Attribut kann nur 1 Tag der Woche dargestellt werden.

Bei Feldern, in denen kombinierbare Enumerationen gespeichert werden, werden die einzelnen Enumerationswerte im Feld als Bitgruppen behandelt. Daher werden solche Felder gelegentlich als Bitfelder bezeichnet. Um Enumerationswerte für die Speicherung in einem Bitfeld zu kombinieren, verwenden Sie die booleschen Bedingungsoperatoren. Wenn Sie ein Bitfeld auf das Vorhandensein eines bestimmten Enumerationswerts testen möchten, verwenden Sie die booleschen logischen Operatoren. Damit ein Bitfeld kombinierte Enumerationswerte richtig speichert und abruft, muss jeder in der Enumeration definierte Wert eine Potenz von 2 sein. Nur in diesem Fall können die booleschen logischen Operatoren die im Feld gespeicherten einzelnen Enumerationswerte extrahieren.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, fügen Sie der Enumeration FlagsAttribute hinzu.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie eine Warnung dieser Regel, wenn die Enumerationswerte nicht kombinierbar sein sollen.

Beispiel

Im folgenden Beispiel ist DaysEnumNeedsFlags eine Enumeration, die den Anforderungen an die Verwendung von FlagsAttribute entspricht, dieses Element jedoch nicht enthält. Die ColorEnumShouldNotHaveFlag-Enumeration verfügt nicht über Werte, die Potenzen von 2 sind, gibt FlagsAttribute jedoch in fehlerhafter Weise an. Dies verstößt gegen die Regel CA2217: Enumerationen nicht mit FlagsAttribute markieren.

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
   }
}

Verwandte Regeln

CA2217: Enumerationen nicht mit FlagsAttribute markieren

Siehe auch

Referenz

System.FlagsAttribute