CA2211: Campos não constantes não devem ser visíveis
Property | valor |
---|---|
ID da regra | CA2211 |
Título | Os campos não constantes não devem ser visíveis |
Categoria | Utilização |
A correção está quebrando ou não quebrando | Quebrando |
Habilitado por padrão no .NET 8 | Como sugestão |
Motivo
Um campo estático público ou protegido não é constante nem é somente leitura.
Descrição da regra
Os campos estáticos que não são constantes nem somente leitura não são thread-safe. O acesso a tal campo deve ser cuidadosamente controlado e requer técnicas avançadas de programação para sincronizar o acesso ao objeto de classe. Como essas são habilidades difíceis de aprender, e testar esse objeto coloca seus próprios desafios, os campos estáticos são melhor usados para armazenar dados que não mudam. Esta regra aplica-se às bibliotecas; Os aplicativos não devem expor nenhum campo.
Como corrigir violações
Para corrigir uma violação dessa regra, torne o campo estático constante ou somente leitura. Se isso não for possível, redesenhe o tipo para usar um mecanismo alternativo, como uma propriedade thread-safe que gerencia o acesso thread-safe ao campo subjacente. Perceba que problemas como contenção de bloqueio e deadlocks podem afetar o desempenho e o comportamento da biblioteca.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra se você estiver desenvolvendo um aplicativo e, portanto, tiver controle total sobre o acesso ao tipo que contém o campo estático. Os designers de bibliotecas não devem suprimir um aviso desta regra; O uso de campos estáticos não constantes pode dificultar o uso correto da biblioteca pelos desenvolvedores.
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 CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211
Para desabilitar a regra para um arquivo, pasta ou projeto, defina sua severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2211.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Exemplo
O exemplo a seguir mostra um tipo que viola essa regra.
Imports System
Namespace ca2211
Public Class SomeStaticFields
' Violates rule: AvoidNonConstantStatic;
' the field is public and not a literal.
Public Shared publicField As DateTime = DateTime.Now
' Satisfies rule: AvoidNonConstantStatic.
Public Shared ReadOnly literalField As DateTime = DateTime.Now
' Satisfies rule: NonConstantFieldsShouldNotBeVisible;
' the field is private.
Private Shared privateField As DateTime = DateTime.Now
End Class
End Namespace
public class SomeStaticFields
{
// Violates rule: AvoidNonConstantStatic;
// the field is public and not a literal.
static public DateTime publicField = DateTime.Now;
// Satisfies rule: AvoidNonConstantStatic.
public static readonly DateTime literalField = DateTime.Now;
// Satisfies rule: NonConstantFieldsShouldNotBeVisible;
// the field is private.
static DateTime privateField = DateTime.Now;
}