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