CA1802: Use literais quando apropriado
Property | valor |
---|---|
ID da regra | CA1802 |
Título | Use literais quando apropriado |
Categoria | Desempenho |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Não |
Motivo
Um campo é declarado static
e readonly
(Shared
e ReadOnly
no Visual Basic) e é 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 static readonly
campo é inicializado quando é declarado e um construtor estático não é declarado explicitamente, o compilador emite um construtor estático para inicializar o campo.
O valor de um const
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 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 static
e readonly
pelo const
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.
Advertência
Para membros públicos ou visíveis externamente, alterar static readonly
para const
pode levar a problemas.
const
valores são incorporados em assemblies dependentes em tempo de compilação, portanto, as alterações no valor da biblioteca podem não se propagar, potencialmente causando erros. Se o valor do seu membro puder mudar no futuro, suprima esta regra.
Nota
Usar const
é seguro para private
membros e geralmente seguro para internal
membros, a menos que exposto via InternalsVisibleTo
ou implantado separadamente.
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
Nota
Substitua a parte XXXX
do CAXXXX
pelo ID da regra aplicável.
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, UseReadOnly
, que viola a regra e um tipo, 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";
}