CA2211: Campos não constantes não devem ser visíveis
Property | Valor |
---|---|
ID da regra | CA2211 |
Título | Campos não constantes não devem ser visíveis |
Categoria | Usage |
Correção interruptiva ou sem interrupção | Quebra |
Habilitado por padrão no .NET 8 | Como sugestão |
Causa
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 esse campo deve ser controlado cuidadosamente e exige técnicas de programação avançadas para sincronizar o acesso ao objeto da classe. Como essas habilidades são difíceis de aprender e testar esse objeto apresenta seus próprios desafios, os campos estáticos são melhor usados para armazenar dados que não se alteram. Essa regra se aplica a bibliotecas. 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, reprojete o tipo para usar um mecanismo alternativo, como uma propriedade thread-safe que gerencie 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 biblioteca não devem suprimir um aviso dessa regra. Usar campos estáticos não constantes pode dificultar o uso da biblioteca para os desenvolvedores usarem corretamente.
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 CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211
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.CA2211.severity = none
Para obter mais informações, confira 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;
}