Compartir a través de


CA1008: Las enumeraciones deben tener un valor igual a cero

TypeName

EnumsShouldHaveZeroValue

Identificador de comprobación

CA1008

Categoría

Microsoft.Design

Cambio problemático

No problemático: cuando le solicitan que agregue un valor None a una enumeración sin marca. Problemático: cuando le solicitan que cambie el nombre o que quite cualquier valor de enumeración.

Motivo

Una enumeración sin un FlagsAttribute aplicado no define un miembro que tiene un valor de cero; o una enumeración que tiene un FlagsAttribute aplicado define un miembro que tiene 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, igual que otros tipos de valor, es cero.Una enumeración con atributo y sin marcas debería definir un miembro que tiene 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 más frecuentemente.Tenga en cuenta que, de forma predeterminada, si el valor del primer miembro de la enumeración no se establece en la declaración, su valor es cero.

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 si hay varios miembros que tienen el valor cero en una enumeración con atributos y marcas, 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 marcas, defina un miembro que tenga el valor de cero; esto no es un cambio importante.Para las enumeraciones con atributo y marcas que definen un miembro con valor cero, denomine el miembro "None" y elimine cualquier miembro que tenga 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

CA2217: No marcar enumeraciones con FlagsAttribute

CA1700: No nombrar valores de enumeración como 'Reserved'

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

CA1028: El almacenamiento de la enumeración debe ser de tipo Int32

CA1027: Marcar enumeraciones con FlagsAttribute

Vea también

Referencia

Enum