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 const
static 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, , UseReadOnly
UseConstant
que 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";
}