Compartilhar via


Enums devem ter o valor zero

TypeName

EnumsShouldHaveZeroValue

CheckId

CA1008

Category (Categoria)

Microsoft.Design

Quebrando alterar

Não separável - se lhe for solicitado para adicionar um Nenhumvalor de a enumeration.Breaking um sinalizar de não - se lhe 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 com um valor zero; ou uma enumeração com um aplicado FlagsAttribute define um membro com um valor de zero mas seu nome não é 'Nenhum' ou a enumeração define vários membros com valores zero.

Descrição da regra

O valor padrão de uma enumeração un-initialized como outros tipos de valor é zero.Uma enumeração não-atribuídos sinalizadores deve definir um membro com o valor de zero para que o valor padrão é um valor válido da enumeração.Se apropriado, o membro nome 'Nenhum'.Caso contrário, atribua zero para o membro mais comumente usado.Observe que, se o valor do primeiro membro de enumeração não é conjunto na declaração, seu valor é zero por padrão.

Se uma enumeração que tenha o FlagsAttribute aplicado define um membro com valor zero, o nome deve ser 'Nenhum' para indicar que nenhum valor foram definidos na enumeração. Uso de um membro com valor zero para qualquer Outros finalidade é contrária ao uso do 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 houver vários membros com o valor zero em uma enumeração atribuído sinalizadores, Enum.ToString() Retorna resultados incorretos para membros que não são zero.

Como corrigir violações

Para corrigir uma violação desta regra não-atribuído sinalizadores de enumerações define um membro com o valor de zero; essa é uma alterar não-separáveis.Para enumerações atribuído sinalizadores que definem um membro com valor zero, chamar esse membro de 'Nenhum' e excluir qualquer Outros membro com um valor de zero; isso é uma alterar de quebra.

Quando suprimir avisos

Não suprimir um aviso da regra, com exceção de enumerações atribuído sinalizadores que tenham sido fornecidos anteriormente.

Exemplo

O exemplo a seguir mostra duas enumerações que satisfizerem 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

Não marque enums com FlagsAttribute

Não nomear valores de enum 'Reservado'

Não prefixo valores de enum com nome de tipo

Armazenamento de enum deve ser Int32

Marcar enums com FlagsAttribute

Consulte também

Referência

System.Enum