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