Partilhar via


CA1008: os enums devem ter valor zero

TypeName

EnumsShouldHaveZeroValue

CheckId

CA1008

Categoria

Microsoft.Design

Alteração Significativa

Sem-quebras - quando for solicitado a adicionar um valor de Nenhum a uma enumeração de não sinalizador. Interromper - quando for solicitado a renomear ou remover todos os valores da enumeração.

Causa

Uma enumeração sem FlagsAttribute aplicado não definir um membro que tinha um valor de zero; ou uma enumeração que tem FlagsAttribute aplicado não definir um membro que tinha um valor de zero mas seu nome for “nenhuma”), ou a enumeração definirá membros zero valor múltiplo.

Descrição da Regra

O valor padrão de uma enumeração não inicializadas, exatamente como outros tipos de valor, é zero.Uma enumeração non-flags−attributed deve definir um membro que possui o valor de zero de forma que o valor padrão é um valor válido da enumeração.Se apropriado, o nome do membro “nenhum”.Se não, atribua zero com mais frequência ao membro usado.Observe que, por padrão, se o valor do primeiro membro de enumeração não for definido na declaração, seu valor é zero.

Se uma enumeração que tem FlagsAttribute aplicado define um valor de zero membro, seu nome não deve ser “nenhum” para indicar que nenhum valor esteve definido na enumeração.Usar um membro sem valor de para qualquer outra finalidade é do contador ao uso de FlagsAttribute que AND e OR operadores bit a bit são inúteis com o membro.Isso significa que somente um membro deve ser atribuído o valor zero.Observe que se vários membros que têm o valor zero ocorrer em uma enumeração sinalizador- alocada, Enum.ToString() retornam resultados incorretos para membros que não são zero.

Como Corrigir Violações

Para corrigir uma violação desta regra para enumerações non-flags−attributed, defina um membro que possui o valor de zero; essa é uma alteração não recentes.Para enumerações sinalizador- atribuídas que definem um membro zero, o valor desse membro “nenhum” e exclui todos os outros membros que têm um valor de zero; essa é uma alteração.

Quando Suprimir Alertas

Não suprima um aviso desta regra com exceção das enumerações sinalizador- atribuídas que têm enviado anteriormente.

Exemplo

O exemplo a seguir mostra duas enumerações que satisfazem a regra e uma enumeração, BadTraceOptions, que viola a regra.

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

Regras Relacionadas

CA2217: não marcar enums com FlagsAttribute

CA1700: não nomeie valores de enum como 'Reservados'

CA1712: não use valores enum como prefixo com o nome do tipo

CA1028: o armazenamento de enum deve ser Int32

CA1027: marcar enums com FlagsAttribute

Consulte também

Referência

Enum