Enums devem ter o valor zero
TypeName |
EnumsShouldHaveZeroValue |
CheckId |
CA1008 |
Category (Categoria) |
Microsoft.Design |
Quebrando alterar |
Não separável - se lhe for solicitado para adicionar um Nenhumvalor de a enumeration.Breaking um sinalizar de não - se lhe 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 com um valor zero; ou uma enumeração com um aplicado FlagsAttribute define um membro com um valor de zero mas seu nome não é 'Nenhum' ou a enumeração define vários membros com valores zero.
Descrição da regra
O valor padrão de uma enumeração un-initialized como outros tipos de valor é zero.Uma enumeração não-atribuídos sinalizadores deve definir um membro com o valor de zero para que o valor padrão é um valor válido da enumeração.Se apropriado, o membro nome 'Nenhum'.Caso contrário, atribua zero para o membro mais comumente usado.Observe que, se o valor do primeiro membro de enumeração não é conjunto na declaração, seu valor é zero por padrão.
Se uma enumeração que tenha o FlagsAttribute aplicado define um membro com valor zero, o nome deve ser 'Nenhum' para indicar que nenhum valor foram definidos na enumeração. Uso de um membro com valor zero para qualquer Outros finalidade é contrária ao uso do FlagsAttribute em que a e e ou operadores de bit são inúteis com o membro. Isso significa que somente um membro deve ser atribuído o valor zero.Observe que, se houver vários membros com o valor zero em uma enumeração atribuído sinalizadores, Enum.ToString() Retorna resultados incorretos para membros que não são zero.
Como corrigir violações
Para corrigir uma violação desta regra não-atribuído sinalizadores de enumerações define um membro com o valor de zero; essa é uma alterar não-separáveis.Para enumerações atribuído sinalizadores que definem um membro com valor zero, chamar esse membro de 'Nenhum' e excluir qualquer Outros membro com um valor de zero; isso é uma alterar de quebra.
Quando suprimir avisos
Não suprimir um aviso da regra, com exceção de enumerações atribuído sinalizadores que tenham sido fornecidos anteriormente.
Exemplo
O exemplo a seguir mostra duas enumerações que satisfizerem 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
Não marque enums com FlagsAttribute
Não nomear valores de enum 'Reservado'
Não prefixo valores de enum com nome de tipo
Armazenamento de enum deve ser Int32
Marcar enums com FlagsAttribute