CA1008: Enums deve ter valor zero
Property | valor |
---|---|
ID da regra | CA1008 |
Título | Enums deve ter valor zero |
Categoria | Desenho |
A correção está quebrando ou não quebrando | Non-breaking - Quando você é solicitado a adicionar um None valor a uma enumeração não-sinalizador. Quebrando - Quando você for solicitado a renomear ou remover quaisquer valores de enumeração. |
Habilitado por padrão no .NET 9 | Não |
Motivo
Uma enumeração sem um aplicado System.FlagsAttribute não define um membro que tenha um valor zero. Ou, uma enumeração que tem um aplicado FlagsAttribute define um membro que tem um valor de zero, mas seu nome não é 'Nenhum'. Ou, a enumeração define vários membros com valor zero.
Por padrão, essa regra examina apenas enumerações visíveis externamente, mas isso é configurável.
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 atribuída a sinalizadores deve definir um membro que tenha o valor zero para que o valor padrão seja um valor válido da enumeração. Se for caso disso, nomeie o membro como «Nenhum» (ou um dos nomes adicionais permitidos). Caso contrário, atribua zero ao membro usado com mais frequência. Por padrão, se o valor do primeiro membro de enumeração não estiver definido na declaração, seu valor será zero.
Se uma enumeração que tem o FlagsAttribute aplicado define um membro de valor zero, seu nome deve ser 'Nenhum' (ou um dos nomes adicionais permitidos) para indicar que nenhum valor foi definido na enumeração. Usar um membro de valor zero para qualquer outra finalidade é contrário ao uso do FlagsAttribute em que os AND
OR
operadores e bitwise são inúteis com o membro. Isto implica que apenas um membro deve ser atribuído o valor zero. Se vários membros que têm o valor zero ocorrerem em uma enumeração atribuída a sinalizadores, Enum.ToString()
retornará resultados incorretos para membros que não são zero.
Como corrigir violações
Para corrigir uma violação dessa regra para enumerações não atribuídas a sinalizadores, defina um membro que tenha o valor zero; trata-se de uma mudança ininterrupta. Para enumerações atribuídas a sinalizadores que definem um membro com valor zero, nomeie esse membro como 'Nenhum' e exclua quaisquer outros membros que tenham um valor zero; Esta é uma mudança revolucionária.
Quando suprimir avisos
Não suprima um aviso desta regra, exceto para enumerações atribuídas a sinalizadores que tenham sido enviadas anteriormente.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA1008
// The code that's violating the rule is on this line.
#pragma warning restore CA1008
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1008.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Configurar código para análise
Use a opção a seguir para configurar em quais partes da sua base de código executar essa regra.
Você pode configurar essa opção apenas para esta regra, para todas as regras às quais ela se aplica ou para todas as regras nesta categoria (Design) às quais ela se aplica. Para obter mais informações, consulte Opções de configuração da regra de qualidade de código.
Incluir superfícies de API específicas
Você pode configurar em quais partes da sua base de código executar essa regra, com base em sua acessibilidade. Por exemplo, para especificar que a regra deve ser executada somente na superfície de API não pública, adicione o seguinte par chave-valor a um arquivo .editorconfig em seu projeto:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Nomes de campos adicionais de valor zero
No .NET 7 e versões posteriores, você pode configurar outros nomes permitidos para um campo de enumeração de valor zero, além None
de . Separe vários nomes pelo |
personagem. A tabela a seguir mostra alguns exemplos.
Valor da opção | Resumo |
---|---|
dotnet_code_quality.CA1008.additional_enum_none_names = Never |
Permite que ambos e None Never |
dotnet_code_quality.CA1008.additional_enum_none_names = Never|Nothing |
Permite None , Never e Nothing |
Exemplo
O exemplo a seguir mostra duas enumerações que satisfazem a regra e uma enumeração, BadTraceOptions
, que viola a regra.
using System;
namespace ca1008
{
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 MainTrace()
{
// 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.
}
}
}
}
Imports System
Namespace ca1008
Public Enum TraceLevel
Off = 0
AnError = 1
Warning = 2
Info = 3
Verbose = 4
End Enum
<Flags>
Public Enum TraceOptions
None = 0
CallStack = &H1
LogicalStack = &H2
DateTime = &H4
Timestamp = &H8
End Enum
<Flags>
Public Enum BadTraceOptions
CallStack = 0
LogicalStack = &H1
DateTime = &H2
Timestamp = &H4
End Enum
Class UseBadTraceOptions
Shared Sub Main1008()
' Set the flags.
Dim badOptions As BadTraceOptions =
BadTraceOptions.LogicalStack Or BadTraceOptions.Timestamp
' Check whether CallStack is set.
If ((badOptions And BadTraceOptions.CallStack) =
BadTraceOptions.CallStack) Then
' This 'If' statement is always true.
End If
End Sub
End Class
End Namespace
Regras conexas
- CA2217: Não marcar enums com FlagsAttribute
- CA1700: Não nomeie valores de enum 'Reservado'
- CA1712: Não prefixar valores de enum com nome de tipo
- CA1028: O armazenamento de enum deve ser Int32
- CA1027: Marcar enums com FlagsAttribute