Partage via


CA2211 : Les champs non constants ne doivent pas être visibles

Propriété Value
Identificateur de la règle CA2211
Titre Les champs non constants ne doivent pas être visibles
Catégorie Utilisation
Le correctif est cassant ou non cassant Rupture
Activé par défaut dans .NET 8 À titre de suggestion

Cause

Un champ statique public ou protégé n’est pas constant ni en lecture seule.

Description de la règle

Les champs statiques qui ne sont ni constants ni en lecture seule ne sont pas thread-safe. L’accès à un tel champ doit être scrupuleusement contrôlé et requiert des techniques de programmation évoluées pour synchroniser l’accès à l’objet de classe. Étant donné que ces compétences sont difficiles à apprendre et à tester un tel objet pose ses propres défis, les champs statiques sont mieux utilisés pour stocker les données qui ne changent pas. Cette règle s’applique aux bibliothèques ; les applications ne doivent pas exposer de champs.

Comment corriger les violations

Pour corriger une infraction de cette règle, rendez la constante de champ statique ou en lecture seule. Si cela n’est pas possible, remaniez le type pour utiliser un autre mécanisme, tel qu’une propriété thread-safe qui gère l’accès thread-safe au champ sous-jacent. Réalisez que les problèmes tels que la contention de verrou et les blocages peuvent affecter les performances et le comportement de la bibliothèque.

Quand supprimer les avertissements

Il est sûr de supprimer un avertissement de cette règle si vous développez une application et avez donc un contrôle total sur l’accès au type qui contient le champ statique. Les concepteurs de bibliothèque ne doivent pas supprimer un avertissement de cette règle ; l’utilisation de champs statiques non constants peut rendre difficile l’utilisation de la bibliothèque pour les développeurs.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemple

L’exemple suivant montre un type qui enfreint cette règle.


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