CA1008: Enums devem ter o valor zero
TypeName |
EnumsShouldHaveZeroValue |
CheckId |
CA1008 |
<strong>Categoria</strong> |
Microsoft.design |
Alteração significativa |
Não-separável - quando for solicitado para adicionar um Nenhum valor para uma enumeração não sinalizador.Quebrando - quando você 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 que tenha um valor de zero. ou uma enumeração que tenha um aplicado FlagsAttribute define um membro que tenha um valor igual a zero, mas seu nome não é 'None' ou a enumeração define vários membros com valor zero.
Descrição da regra
O valor padrão de uma enumeração não inicializada, assim como outros tipos de valor é zero.Uma enumeração não flags−attributed deve definir um membro que possui o valor de zero para que o valor padrão é um valor válido da enumeração.Se apropriado, o nome do membro 'None'.Caso contrário, atribua zero para o membro mais freqüentemente usado.Observe que, por padrão, se o valor do primeiro membro de enumeração não é definido na declaração, seu valor é zero.
Se uma enumeração que tem o FlagsAttribute aplicados define um membro com valor zero, seu nome deve ser 'None' para indicar que não há valores foram definidos na enumeração.Usando um membro com valor zero para qualquer outra finalidade é contrária ao uso da FlagsAttribute em que a e e ou operadores bit a bit são inúteis com o membro.Isso implica que apenas um membro deve ser atribuído o valor zero.Observe que, se vários membros que possuem o valor zero ocorre em uma enumeração atribuído de sinalizadores, Enum.ToString() retorna resultados incorretos para membros que não forem zero.
Como corrigir violações
Para corrigir uma violação desta regra de não-flags−attributed enumerações, definir um membro que possui o valor de zero. Essa é uma alteração não-separável.Enumerações atribuído de sinalizadores que definem um membro com valor zero, chamar esse membro de 'None' e exclua quaisquer membros que possuem um valor de zero. Esta é uma alteração significativa.
Quando suprimir avisos
Não suprimir um aviso da regra, exceto para enumerações atribuído de sinalizadores que tenha previamente fornecidos.
Exemplo
O exemplo a seguir mostra duas enumerações que satisfazem 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
CA2217: Não marque enums com FlagsAttribute
CA1700: Não nomear valores enum "Reservada"
CA1712: Não os valores de enum com nome de tipo de prefixo
CA1028: O armazenamento de Enum deve ser Int32
CA1027: Marcar enums com FlagsAttribute