CA2211: Os campos não constante não deverá ser 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 avançadas de programação para sincronizar o acesso ao objeto de classe. Como esses são difíceis de habilidades para descobrir e mestre e teste tal objeto apresenta seus próprios desafios, campos estáticos melhor são usados para armazenar dados que não é alterado. Esta regra se aplica a bibliotecas; aplicativos não devem expor quaisquer campos.
Como corrigir violações
Para corrigir uma violação desta regra, verifique o campo estático constante ou somente leitura. Se não for possível, recrie o tipo de um mecanismo alternativo como, por exemplo, uma propriedade de thread-safe que gerencia o acesso ao campo base do thread-safe. 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 da regra, se você estiver desenvolvendo um aplicativo e, portanto, ter controle total sobre o acesso ao tipo que contém o campo estático. Designers de biblioteca não devem eliminar um aviso esta regra; usar 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;
}
}