Compartilhar via


CA2211: os campos não constantes não devem estar visíveis

TypeName

NonConstantFieldsShouldNotBeVisible

CheckId

CA2211

Categoria

Microsoft.Usage

Alteração Significativa

Quebra

Causa

Um público ou um campo estático protegido não são constantes ou é somente leitura.

Descrição da Regra

Os campos estáticos que não são constantes ou somente leitura não é seguro para threads.O acesso a esse campo deve ser cuidadosamente controlado exige e técnicas de programação avançado para sincronizar o acesso ao objeto da classe.Como essas são difíceis a aprender habilidades e dominar, e testando tais representa um objeto de seus próprios desafios, os campos estáticos são usados melhor para armazenar os dados que não são alterados.Essa regra se aplica às bibliotecas; os aplicativos não devem expor os campos.

Como Corrigir Violações

Para corrigir uma violação desta regra, faça a constante estático do campo ou somente leitura.Se isso não for possível, recrie os dados de tipo para usar um mecanismo alternativo como uma propriedade de segura que gerencia o acesso isento ao campo subjacente.Realize que os problemas como a contenção de bloqueio e os deadlocks podem afetar o desempenho e o comportamento de biblioteca.

Quando Suprimir Alertas

É seguro suprimir um aviso dessa regra se você estiver desenvolvendo um aplicativo e como consequência para ter controle total sobre o acesso ao tipo que contém o campo estático.Os designers da biblioteca não devem omitir um aviso desta regra; usar campos estáticos de constante não pode fazer usando a biblioteca difícil para que os desenvolvedores a ser usada corretamente.

Exemplo

O exemplo a seguir mostra um tipo que viola esta 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;
   }
}