Sdílet prostřednictvím


CA1008: Výčty musí mít nulovou hodnotu

TypeName

EnumsShouldHaveZeroValue

CheckId

CA1008

Kategorie

Microsoft.Design

Narušující změna

Nenarušující - je-li vyžadováno přidat hodnotu None do výčtu bez příznaků. Narušující - je-li vyžadováno přejmenovat nebo odstranit kteroukoliv hodnotu výčtu.

Příčina

Výčet bez použitého atributu System.FlagsAttribute nedefinující člen, který má hodnotu nula, výčet s použitým atributem FlagsAttribute definující člen, který má hodnotu nula, ale její název není ´None´, nebo výčet definující více členů s hodnotou nula.

Popis pravidla

Výchozí hodnota neinicializovaného výčtu, stejně jako u jiných typů hodnot, je nula.Výčet s atributem určujícím, že nemá obsahovat příznaky, byl měl definovat člen s hodnotou nula, aby výchozí hodnota byla platnou hodnotou výčtu.Je-li to vhodné, pojmenujte tento člen ´None´.Jinak přidělte nejčastěji používanému členu hodnotu nula.Povšimněte si, že pokud není hodnota prvního členu výčtu nastavena v deklaraci, je ve výchozím nastavení nula.

Má-li výčet použit atribut FlagsAttribute a definuje člen s hodnotou nula, měl by jeho název být 'None', aby bylo zjevné, že ve výčtu nebyly nastaveny žádné hodnoty.Použití nulového členu pro libovolný jiný účel je v rozporu s použitím atributu FlagsAttribute v tom, že bitové operátory AND a OR postrádají s tímto členem smysl.To znamená, že hodnotu nula by měl mít přiřazenu pouze jeden člen.Povšimněte si, že pokud se ve výčtu s atributem určujícím, že výčet obsahuje příznaky, vyskytne více členů s hodnotou nula, vrací funkce Enum.ToString() pro nenulové členy nesprávné výsledky.

Jak vyřešit porušení

Chcete-li opravit porušení tohoto pravidla u výčtů s atributem určujícím, že výčet neobsahuje příznaky, definujte člen s hodnotou nula; tato změna je nenarušující.Ve výčtech obsahujících příznaky definujících nulový člen pojmenujte tento člen 'None' a odstraňte všechny ostatní členy s hodnotou nula; tato změna je narušující.

Kdy potlačit upozornění

Upozornění tohoto pravidla nepotlačujte, nejde-li o výčet s příznaky, který byl již odeslán.

Příklad

Následující příklad ukazuje dva výčty splňující pravidlo a jeden výčet, BadTraceOptions, který pravidlo porušuje.

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

Související pravidla

CA2217: Neoznačovat výčty s FlagsAttribute

CA1700: Není název hodnoty výčtu "Vyhrazené"

CA1712: Není předpona hodnoty výčtu s názvem typu

CA1028: Výčet úložiště by mělo být Int32

CA1027: Značka výčty s FlagsAttribute

Viz také

Referenční dokumentace

System.Enum