Compartir a través de


CA2211: Los campos no constantes no deben ser visibles

Nombre de tipo

NonConstantFieldsShouldNotBeVisible

Identificador de comprobación

CA2211

Categoría

Microsoft.Usage

Cambio problemático

Motivo

Un campo estático público o protegido no es constante ni es de sólo lectura.

Descripción de la regla

Los campos estáticos que no son constantes ni de sólo lectura no son seguros para subprocesos.Obtener acceso a este tipo de campo se debe controlar cuidadosamente y requiere técnicas de programación avanzadas para sincronizar el acceso al objeto de clase.Puesto que hay aspectos difíciles de aprender, y comprobar un objeto tiene sus propias dificultades, es mejor utilizar los campos estáticos para los datos de almacén que no cambian.Esta regla se aplica a las bibliotecas; las aplicaciones no deben exponer ningún campo.

Cómo corregir infracciones

Para corregir una infracción de esta regla, marque la constante de campo como estática o de sólo lectura.Si no es posible, vuelva a diseñar el tipo utilizando un mecanismo alternativo como una propiedad segura para subprocesos que administra el acceso seguro al campo subyacente.Tenga en cuenta que los problemas como disputa la contención de bloqueo y los interbloqueos podrían afectar al rendimiento y al comportamiento de la biblioteca.

Cuándo suprimir advertencias

Resulta seguro suprimir una advertencia de esta regla si está desarrollando una aplicación y, por tanto, tiene control total sobre el acceso al tipo que contiene el campo estático.Los diseñadores de bibliotecas no deben suprimir ninguna advertencia de esta regla; si se utilizan campos estáticos no constantes puede hacer que los desarrolladores no utilicen la biblioteca correctamente.

Ejemplo

El siguiente ejemplo muestra un tipo que infringe esta regla.


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