Partager via


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

TypeName

NonConstantFieldsShouldNotBeVisible

CheckId

CA2211

Catégorie

Microsoft.Usage

Modification avec rupture

Oui

Cause

Un champ statique public ou protégé n'est ni 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. Sachant que ces compétences sont difficiles à apprendre et à maîtriser, et que le test d'un tel objet pose ses propres difficultés, les champs statiques trouvent leur meilleure utilisation dans le stockage de données qui ne changent pas. Cette règle s'applique aux bibliothèques ; les applications ne doivent exposer aucun champ.

Comment corriger les violations

Pour corriger une violation de cette règle, rendez le champ statique constant ou en lecture seule. Si ce n'est pas possible, refondez le design du type pour utiliser un mécanisme de substitution tel qu'une propriété thread-safe qui gère l'accès thread-safe au champ sous-jacent. Vous devez comprendre que des problèmes tels que le conflit de verrous et les interblocages peuvent affecter les performances et le comportement de la bibliothèque.

Quand supprimer les avertissements

Il est possible de supprimer sans risque un avertissement de cette règle si vous développez une application, et par conséquent, disposez d'un contrôle total sur l'accès au type qui contient le champ statique. Les concepteurs de bibliothèque ne doivent supprimer aucun avertissement de cette règle ; l'utilisation de champs statiques non constants peut rendre une utilisation correcte de la bibliothèque difficile pour les développeurs.

Exemple

L'exemple suivant affiche un type qui ne respecte pas cette règle.


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