Compartilhar via


CA2211: Não constante campos não devem estar visíveis

TypeName

NonConstantFieldsShouldNotBeVisible

CheckId

CA2211

<strong>Categoria</strong>

Microsoft.Usage

Alteração significativa

Quebrando

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 são somente leitura não thread-safe.Acesso a tal campo deve ser cuidadosamente controlado e requer técnicas de programação avançadas para sincronizar o acesso ao objeto de classe.Como esses são difíceis de habilidades para descobrir e mestre e testes de tal objeto apresenta seus próprios desafios, campos estáticos são melhor usados para armazenar dados que não é alterado.Essa regra se aplica a bibliotecas; aplicativos não devem expor todos os campos.

Como corrigir violações

Para corrigir uma violação desta regra, verifique o campo estático, constante ou somente leitura.Se isso não for possível, recrie o tipo a ser usado um mecanismo alternativo como, por exemplo, uma propriedade de thread-safe que gerencia o acesso do thread-safe ao campo base.Percebe 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 da regra, se você estiver desenvolvendo um aplicativo e, portanto, têm controle total sobre o acesso ao tipo que contém o campo estático.Os designers de biblioteca não devem eliminar um aviso esta regra; campos estáticos de constante não pode fazer usando a biblioteca de difícil para os desenvolvedores para usar corretamente.

Exemplo

O exemplo a seguir mostra um tipo que viole essa regra.


Imports System

Namespace UsageLibrary

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
using System;

namespace UsageLibrary
{
   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;
   }
}