Share via


CA2211: Los campos no constantes no deben ser visibles

Propiedad Value
Identificador de la regla CA2211
Título Los campos no constantes no deben ser visibles
Categoría Uso
La corrección es problemática o no problemática Problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

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

Descripción de la regla

Los campos estáticos que no son constantes ni de sólo lectura no son seguros para subprocesos. El acceso a este tipo de campos se debe controlar cuidadosamente, y se necesitan técnicas de programación avanzadas para sincronizar el acceso al objeto de clase. Dado que son aptitudes difíciles de aprender y probar este tipo de objeto plantea sus propios desafíos, los campos estáticos se usan mejor para almacenar datos 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, haga que el campo estático sea constante o de solo lectura. Si no es posible, vuelva a diseñar el tipo para que use un mecanismo alternativo, como una propiedad segura para subprocesos que administra el acceso seguro para subprocesos al campo subyacente. Tenga en cuenta que los problemas como la contención de bloqueos y los interbloqueos pueden afectar al rendimiento y al comportamiento de la biblioteca.

Cuándo suprimir las advertencias

Una advertencia de esta regla se puede suprimir si está desarrollando una aplicación y, por tanto, tiene el control total sobre el acceso al tipo que contiene el campo estático. Los diseñadores de bibliotecas no deben suprimir una advertencia de esta regla. El uso de campos estáticos no constantes puede dificultar el uso de la biblioteca para los desarrolladores.

Supresión de una advertencia

Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.

#pragma warning disable CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211

Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none del archivo de configuración.

[*.{cs,vb}]
dotnet_diagnostic.CA2211.severity = none

Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.

Ejemplo

En el ejemplo siguiente se muestra un tipo que infringe esta regla.


Imports System

Namespace ca2211

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