Comparteix a través de


CA2211: Los campos no constantes no deben ser visibles

Propiedad Valor
Identificador de la regla CA2211
Título Los campos no constantes no deben ser visibles
Categoría Uso
La corrección interrumpe o no interrumpe Ruptura
Habilitado de forma predeterminada en .NET 10 Como sugerencia
Idiomas aplicables C# y Visual Basic

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 solo lectura no son seguros para hilos. 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 repercutir en el rendimiento y el comportamiento de la biblioteca.

Cuándo suprimir las advertencias

Es seguro suprimir una advertencia bajo esta regla si está desarrollando una aplicación y, por lo tanto, tiene 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 hacer que sea difícil para los desarrolladores usar la biblioteca correctamente.

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