CA1802: Usar literais quando apropriado
Property | Valor |
---|---|
ID da regra | CA1802 |
Título | Usar literais quando apropriado |
Categoria | Desempenho |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 9 | Não |
Causa
Um campo é declarado static
e readonly
(Shared
e ReadOnly
no Visual Basic) e é inicializado com um valor computável no tempo de compilação.
Por padrão, essa regra só examina campos externamente visíveis, estáticos e lidos, mas isso é configurável.
Descrição da regra
O valor de um campo static readonly
é calculado em tempo de execução quando o construtor estático para o tipo de declaração é chamado. Se o campo static readonly
for inicializado quando for declarado e um construtor estático não for declarado explicitamente, o compilador emitirá um construtor estático para inicializar o campo.
O valor de um campo const
é calculado em tempo de compilação e armazenado nos metadados, o que melhora o desempenho em tempo de execução quando é comparado a um campo static readonly
.
Como o valor atribuído ao campo de destino é computável no tempo de compilação, altere a declaração para um campo const
de modo que o valor seja computado no tempo de compilação, e não no tempo de execução.
Como corrigir violações
Para corrigir uma violação dessa regra, substitua os modificadores static
e readonly
pelo modificador const
.
Observação
O uso do modificador const não é recomendado para todos os cenários.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra ou desabilitar a regra, se o desempenho não é uma preocupação.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1802.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Configurar código para analisar
Use as opções a seguir para configurar em quais partes da base de código essa regra deve ser executada.
Você pode configurar essas opções apenas para essa regra, para todas as regras às quais ela se aplica ou para todas as regras nessa categoria (Desempenho) às quais ela se aplica. Para saber mais, confira Opções de configuração de regra de qualidade de código.
Incluir superfícies de API específicas
É possível configurar em quais partes da base de código essa regra deverá ser executada, com base na acessibilidade. Por exemplo, para especificar que a regra deverá ser executada apenas na superfície de API não pública, adicione o seguinte par chave-valor a um arquivo .editorconfig no projeto:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Modificadores obrigatórios
Você pode configurar essa regra para substituir os modificadores de campo obrigatório. Por padrão, static
e readonly
são ambos modificadores obrigatórios para campos analisados. Você pode substituir isso a uma vírgula separada listada de um ou mais valores modificador da tabela abaixo:
Valor de Opção | Resumo |
---|---|
none |
Nenhum requisito de modificador. |
static ou Shared |
Deve ser declarado como 'static' ('Shared' no Visual Basic). |
const |
Deve ser declarado como 'const'. |
readonly |
Deve ser declarado como "readonly". |
Por exemplo, para especificar que a regra deve ser executada em campos estáticos e de instância, adicione o seguinte par chave-valor a um arquivo .editorconfig em seu projeto:
dotnet_code_quality.CA1802.required_modifiers = none
Exemplo
O exemplo a seguir mostra um tipo, UseReadOnly
que viola a regra e um tipo, UseConstant
que cumpre a regra.
Imports System
Namespace ca1802
' This class violates the rule.
Public Class UseReadOnly
Shared ReadOnly x As Integer = 3
Shared ReadOnly y As Double = x + 2.1
Shared ReadOnly s As String = "readonly"
End Class
' This class satisfies the rule.
Public Class UseConstant
Const x As Integer = 3
Const y As Double = x + 2.1
Const s As String = "const"
End Class
End Namespace
// This class violates the rule.
public class UseReadOnly
{
static readonly int x = 3;
static readonly double y = x + 2.1;
static readonly string s = "readonly";
public void Print()
{
Console.WriteLine(s);
}
}
// This class satisfies the rule.
public class UseConstant
{
const int x = 3;
const double y = x + 2.1;
const string s = "const";
}