Partilhar via


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;
}