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 o valor de 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 zero; ou uma enumeração que tenha um aplicado FlagsAttribute define um membro que tenha um valor zero, mas seu nome não é 'None' ou a enumeração define vários com valor zero membros.
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 aplicado define um membro com valor zero, seu nome deve ser 'None' para indicar que os valores não foram definido 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 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 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 são zero.
Como corrigir violações
Para corrigir uma violação desta regra para não flags−attributed enumerações, definir um membro que possui o valor de zero; Esta é uma alteração de não-separável. Para enumerações atribuído de sinalizadores que definem um membro com valor zero, nomeie esse membro 'None' e excluir 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 os valores de enum 'Reservado'
CA1712: Não os valores de enum com nome de tipo de prefixo
CA1028: Armazenamento de enum deve ser Int32
CA1027: Marcar enums com FlagsAttribute