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