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