Udostępnij za pośrednictwem


CA1008: Wyliczenia powinny mieć wartość zero

TypeName

EnumsShouldHaveZeroValue

CheckId

CA1008

Kategoria

Microsoft.Design

Zmiana kluczowa

Niekluczowa - po wyświetleniu monitu, aby dodać wartość Brak do wyliczenia bez flagi. Kluczowa - po wyświetleniu monitu, aby zmienić nazwę lub usunąć wszystkie wartości z wyliczenia.

Przyczyna

Wyliczenie bez zastosowanego FlagsAttribute nie definiuje elementu członkowskiego, który posiada wartość zero; lub wyliczenie, które stosuje FlagsAttribute definiuje element członkowski, który posiada wartość zero, ale o nazwie innej niż 'Brak'; lub też wyliczanie definiuje wiele elementów członkowskich o wartości zero.

Opis reguły

Wartość domyślna niezainicjowanego typu wyliczeniowego, podobnie jak inne typy wartości wynosi zero.Wyliczenie non-flags-attributed powinno definiować element członkowski, który posiada wartość zero, tak aby wartość domyślna była prawidłową wartością wyliczenia.Jeśli jest to poprawne, należy zmienić nazwę elementu członkowskiego na 'Brak'.W przeciwnym razie należy przypisać zero do najczęściej używanego elementu członkowskiego.Należy zauważyć, że domyślnie, jeśli nie ustawiono wartości pierwszego elementu członkowskiego wyliczenia w deklaracji, jego wartość wynosi zero.

Jeśli wyliczenie, które posiada zastosowany FlagsAttribute definiuje niezerowy element członkowski, powinno mieć nazwę "Brak", aby wskazywać na brak ustawionych wartości w wyliczeniu.Używanie niezerowych elementów członkowskich dla innych celów jest sprzeczne z użyciem FlagsAttribute i powoduje, że operatory bitowe AND oraz OR są bezużyteczne w ramach elementu członkowskiego.Oznacza to, że tylko jeden element członkowski powinien mieć przypisaną wartość zero.Uwaga, jeśli w wyliczeniu flags-attributed wystąpi wiele elementów członkowskich mających wartość zero Enum.ToString() zwróci nieprawidłowe wyniki dla niezerowych elementów członkowskich.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady dla wyliczeń non-flags−attributed należy zdefiniować element członkowski, który ma wartość zero; jest to zmiana niekluczowa.Dla wyliczeń flags-attributed definiujących zerowe elementy członkowskie, należy zmienić nazwę tego elementu członkowskiego na 'Brak' oraz usunąć pozostałe elementy członkowskie, które posiadają wartość zero; jest to zmiana kluczowa.

Kiedy pominąć ostrzeżenia

Nie pomijaj ostrzeżeń dotyczących tej reguły, z wyjątkiem wyliczeń flags-attributed, które zostały poprzednio wysłane.

Przykład

Poniższy przykład ilustruje dwa wyliczenia, które spełniają regułę oraz wyliczenie, BadTraceOptions, które narusza regułę.

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

Powiązane reguły

CA2217: Nie oznaczaj wyliczeń za pomocą FlagsAttribute

CA1700: Nie należy nadawać wartościom enum oznaczenia „Reserved"

CA1712: Nie należy poprzedzać wartości enum nazwą typu

CA1028: Pamięć wyliczenia powinna być Int32

CA1027: Oznaczaj wyliczenia za pomocą FlagsAttribute

Zobacz też

Informacje

Enum