Sdílet prostřednictvím


Enumerationen sollten einen Wert von 0 (null) aufweisen

Aktualisiert: November 2007

     TypeName

EnumsShouldHaveZeroValue

CheckId

CA1008

Kategorie

Microsoft.Design

Unterbrechende Änderung

Nicht unterbrechend – Wenn Sie aufgefordert werden, einer Enumeration ohne Flag-Attribut einen None-Wert hinzuzufügen. Unterbrechend – Wenn Sie aufgefordert werden, einen Enumerationswert umzubenennen oder zu entfernen.

Ursache

Eine Enumeration, auf die System.FlagsAttribute nicht angewendet wird, definiert keinen Member mit einem Wert von 0 (null), bzw. eine Enumeration, auf die FlagsAttribute angewendet wird, definiert einen Member mit einem Wert von 0 (null), ihr Name lautet jedoch nicht "None", oder die Enumeration definiert mehrere Member mit dem Wert 0 (null).

Regelbeschreibung

Der Standardwert einer nicht initialisierten Enumeration ist ebenso wie der anderer Werttypen 0 (null). Eine Enumeration ohne das Flags-Attribut sollte einen Member mit dem Wert 0 (null) definieren, damit der Standardwert ein gültiger Wert der Enumeration ist. Geben Sie dem Member gegebenenfalls den Namen "None". Weisen Sie andernfalls den Wert 0 (null) dem am häufigsten verwendeten Member zu. Wenn der Wert des ersten Enumerationsmembers in der Deklaration nicht festgelegt wird, ist 0 (null) der Standardwert.

Wenn eine Enumeration, auf die FlagsAttribute angewendet wird, einen Member mit dem Wert 0 (null) definiert, sollte dieser den Namen "None" haben, um anzugeben, dass in der Enumeration keine Werte festgelegt wurden. Die Verwendung eines Members mit dem Wert 0 (null) für andere Zwecke widerspricht der Verwendung von FlagsAttribute dahingehend, dass die bitweisen Operatoren AND und OR für den Member nutzlos sind. Dies impliziert, dass nur einem Member der Wert 0 (null) zugewiesen werden sollte. Wenn eine Enumeration mit dem Flags-Attribut mehrere Member mit dem Wert 0 (null) enthält, gibt Enum.ToString() für die Member, die nicht den Wert 0 (null) aufweisen, falsche Ergebnisse zurück.

Behandlung von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, definieren Sie bei Enumerationen ohne Flags-Attribut einen Member mit dem Wert 0 (null). Dies ist eine nicht unterbrechende Änderung. Geben Sie bei Enumerationen, die einen Member mit dem Wert 0 (null) definieren, diesem Member den Namen "None", und löschen Sie alle übrigen Member, die einen Wert von 0 (null) aufweisen. Dies ist eine unterbrechende Änderung.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie eine Warnung dieser Regel nur bei Enumerationen mit dem Flags-Attribut, die zuvor versendet wurden.

Beispiel

Das folgende Beispiel zeigt zwei Enumerationen, die der Regel entsprechen, und eine Enumeration, BadTraceOptions, die gegen die Regel verstößt.

Imports System

Namespace DesignLibrary

   Public Enum TraceLevel
      Off     = 0
      AnError = 1
      Warning = 2
      Info    = 3
      Verbose = 4
   End Enum

   <Flags> _
   Public Enum TraceOptions
      None         =    0
      CallStack    = &H01
      LogicalStack = &H02
      DateTime     = &H04
      Timestamp    = &H08
   End Enum

   <Flags> _
   Public Enum BadTraceOptions
      CallStack    =    0
      LogicalStack = &H01
      DateTime     = &H02
      Timestamp    = &H04
   End Enum

   Class UseBadTraceOptions

      Shared Sub Main()

         ' Set the flags.
         Dim badOptions As BadTraceOptions = _
            BadTraceOptions.LogicalStack Or BadTraceOptions.Timestamp

         ' Check whether CallStack is set.
         If((badOptions And BadTraceOptions.CallStack) = _
             BadTraceOptions.CallStack)
            ' This 'If' statement is always true.
         End If

      End Sub

   End Class

End Namespace
using System;

namespace DesignLibrary
{
   public enum TraceLevel
   {
      Off     = 0,
      Error   = 1,
      Warning = 2,
      Info    = 3,
      Verbose = 4
   }

   [Flags]
   public enum TraceOptions
   {
      None         =    0,
      CallStack    = 0x01,
      LogicalStack = 0x02,
      DateTime     = 0x04,
      Timestamp    = 0x08,
   }

   [Flags]
   public enum BadTraceOptions
   {
      CallStack    =    0,
      LogicalStack = 0x01,
      DateTime     = 0x02,
      Timestamp    = 0x04,
   }

   class UseBadTraceOptions
   {
      static void Main()
      {
         // Set the flags.
         BadTraceOptions badOptions = 
            BadTraceOptions.LogicalStack | BadTraceOptions.Timestamp;

         // Check whether CallStack is set.
         if((badOptions & BadTraceOptions.CallStack) == 
             BadTraceOptions.CallStack)
         {
            // This 'if' statement is always true.
         }
      }
   }
}
using namespace System;

namespace DesignLibrary
{
   public enum class TraceLevel
   {
      Off     = 0,
      Error   = 1,
      Warning = 2,
      Info    = 3,
      Verbose = 4
   };

   [Flags]
   public enum class TraceOptions
   {
      None         =    0,
      CallStack    = 0x01,
      LogicalStack = 0x02,
      DateTime     = 0x04,
      Timestamp    = 0x08
   };

   [Flags]
   public enum class BadTraceOptions
   {
      CallStack    =    0,
      LogicalStack = 0x01,
      DateTime     = 0x02,
      Timestamp    = 0x04
   };
}

using namespace DesignLibrary;

void main()
{
   // Set the flags.
   BadTraceOptions badOptions = safe_cast<BadTraceOptions> 
      (BadTraceOptions::LogicalStack | BadTraceOptions::Timestamp);

   // Check whether CallStack is set.
   if((badOptions & BadTraceOptions::CallStack) == 
         BadTraceOptions::CallStack)
   {
      // This 'if' statement is always true.
   }
}

Verwandte Regeln

Enumerationen nicht mit FlagsAttribute markieren

Enumerationswerte nicht mit "Reserved" benennen

Keine Typnamen als Präfixe für Enumerationswerte verwenden

Der Enumerationsspeicher sollte Int32 sein

Enumerationen mit FlagsAttribut markieren

Siehe auch

Referenz

System.Enum