CA1008: Enums devem ter o valor zero

TypeName

EnumsShouldHaveZeroValue

CheckId

CA1008

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Não-separável - quando for solicitado para adicionar um Nenhum o valor de uma enumeração não sinalizador.Quebrando - quando você for solicitado a renomear ou remover quaisquer valores de enumeração.

Causa

Uma enumeração sem um aplicado System.FlagsAttribute não define um membro que tenha um valor zero; ou uma enumeração que tenha um aplicado FlagsAttribute define um membro que tenha um valor zero, mas seu nome não é 'None' ou a enumeração define vários com valor zero membros.

Descrição da regra

O valor padrão de uma enumeração não inicializada, assim como outros tipos de valor é zero. Uma enumeração não flags−attributed deve definir um membro que possui o valor de zero para que o valor padrão é um valor válido da enumeração. Se apropriado, o nome do membro 'None'. Caso contrário, atribua zero para o membro mais freqüentemente usado. Observe que, por padrão, se o valor do primeiro membro de enumeração não é definido na declaração, seu valor é zero.

Se uma enumeração que tem o FlagsAttribute aplicado define um membro com valor zero, seu nome deve ser 'None' para indicar que os valores não foram definido na enumeração. Usando um membro com valor zero para qualquer outra finalidade é contrária ao uso da FlagsAttribute em que a e e ou operadores de 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 possuem o valor zero ocorre em uma enumeração atribuído de sinalizadores Enum.ToString() retorna resultados incorretos para membros que são zero.

Como corrigir violações

Para corrigir uma violação desta regra para não flags−attributed enumerações, definir um membro que possui o valor de zero; Esta é uma alteração de não-separável. Para enumerações atribuído de sinalizadores que definem um membro com valor zero, nomeie esse membro 'None' e excluir quaisquer membros que possuem um valor de zero. Esta é uma alteração significativa.

Quando suprimir avisos

Não suprimir um aviso da regra, exceto para enumerações atribuído de sinalizadores que tenha previamente fornecidos.

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 marque enums com FlagsAttribute

CA1700: Não nomear os valores de enum 'Reservado'

CA1712: Não os valores de enum com nome de tipo de prefixo

CA1028: Armazenamento de enum deve ser Int32

CA1027: Marcar enums com FlagsAttribute

Consulte também

Referência

System.Enum