CA1008: Las enumeraciones deben tener un valor igual a cero
Nombre de tipo |
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 System.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