Share via


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 8 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, UseReadOnlyque viola a regra e um tipo, UseConstantque 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";
}