Partilhar via


CA1802: Use literais quando apropriado

Propriedade valor
ID da regra CA1802
Cargo Use literais quando apropriado
Categoria Desempenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

Um campo é declarado static e readonly (Shared e no Visual Basic) e ReadOnly é inicializado com um valor que é computável em tempo de compilação.

Por padrão, essa regra só examina campos visíveis externamente, estáticos e somente leitura, mas isso é configurável.

Descrição da regra

O valor de um static readonly campo é calculado em tempo de execução quando o construtor estático para o tipo de declaração é chamado. Se o campo é inicializado quando é declarado e um construtor estático não é declarado explicitamente, o compilador emite um construtor estático para inicializar o static readonly campo.

O valor de um campo é calculado em tempo de compilação e armazenado nos metadados, o que melhora o desempenho em tempo de execução quando comparado a um conststatic readonly campo.

Como o valor atribuído ao campo de destino é computável em tempo de compilação, altere a declaração para um const campo para que o valor seja calculado em tempo de compilação em vez de em tempo de execução.

Como corrigir violações

Para corrigir uma violação desta regra, substitua os modificadores const e readonly pelo static modificador.

Nota

O uso do modificador const não é recomendado para todos os cenários.

Quando suprimir avisos

É seguro suprimir um aviso desta regra, ou desativá-la, se o desempenho não for motivo de preocupação.

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 CA1802
// The code that's violating the rule is on this line.
#pragma warning restore CA1802

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA1802.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Configurar código para análise

Use as opções a seguir para configurar em quais partes da base de código executar essa regra.

Você pode configurar essas opções apenas para esta regra, para todas as regras às quais ela se aplica ou para todas as regras nesta categoria (Desempenho) à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

Modificadores necessários

Você pode configurar essa regra para substituir os modificadores de campo necessários. Por padrão, static e readonly ambos são modificadores necessários para campos que são analisados. Você pode substituir isso por uma lista separada por vírgulas de um ou mais valores modificadores da tabela abaixo:

Valor da opção Resumo
none Nenhum requisito modificador.
static ou Shared Deve ser declarado como 'estático' ('Compartilhado' no Visual Basic).
const Deve ser declarado como «const».
readonly Deve ser declarado como "somente leitura".

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, , que viola a regra e um tipo, , UseReadOnlyUseConstantque satisfaz 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";
}