Share via


Las enumeraciones deben tener un valor igual a cero

Actualización: noviembre 2007

Nombre de tipo

EnumsShouldHaveZeroValue

Identificador de comprobación

CA1008

Categoría

Microsoft.Design

Cambio problemático

No problemático: si le solicitan que agregue un valor Ninguno a enumeration.Breaking del no marcador. Si se le solicita que cambie el nombre o que quite cualquier valor de enumeración.

Motivo

Una enumeración sin un System.FlagsAttribute aplicado no define un miembro sin un valor de cero; o una enumeración con un FlagsAttribute aplicado define un miembro sin un valor de cero pero su nombre no es "None" o la enumeración define varios miembros con valor cero.

Descripción de la regla

El valor predeterminado de una enumeración no inicializada, como otros tipos de valor, es cero. Una enumeración con atributo y sin indicadores debería definir un miembro con el valor de cero de modo que el valor predeterminado sea un valor válido de la enumeración. Si es necesario, denomine el miembro "None". De lo contrario, asigne el valor cero al miembro que se utiliza frecuentemente. Tenga en cuenta que si el valor del primer miembro de la enumeración no se establece en la declaración, su valor es cero de forma predeterminada.

Si una enumeración a la que se le haya aplicado FlagsAttribute define un miembro con valor cero, su nombre debe ser "None" para indicar que no se han establecido valores en la enumeración. Utilizando un miembro con valor cero para cualquier otro propósito que no sea el uso de FlagsAttribute en el que los operadores bit a bit AND y OR no son útiles con el miembro. Esto implica que sólo se debería asignar el valor cero a un miembro. Tenga en cuenta que hay varios miembros con el valor cero en la enumeración con atributos e indicadores, Enum.ToString() devuelve resultados incorrectos para los miembros que no tienen valor cero.

Cómo corregir infracciones

Para corregir una infracción de esta regla para las enumeraciones con atributo y sin indicadores, defina un miembro con el valor de cero; éste no es un cambio importante. Para las enumeraciones con atributo e indicadores que definen un miembro con valor cero, denomine el miembro "None" y elimine cualquier miembro con un valor de cero; éste es un cambio importante.

Cuándo suprimir advertencias

No suprima una advertencia de esta regla excepto para enumeraciones con atributo y marcadores que se hayan distribuido previamente.

Ejemplo

El ejemplo siguiente muestra dos enumeraciones que cumplen la regla, y una enumeración BadTraceOptions, que la infringe.

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

Reglas relacionadas

No marcar enumeraciones como FlagsAttribute

No nombrar valores de enumeración como 'Reserved'

No utilizar prefijos en valores de enumeración con el nombre de tipo

El almacenamiento de enumeraciones debe ser Int32

Marcar enumeraciones con FlagsAttribute

Vea también

Referencia

System.Enum