CA2104 : Ne déclarez pas les types référence mutables en lecture seule
TypeName |
DoNotDeclareReadOnlyMutableReferenceTypes |
CheckId |
CA2104 |
Catégorie |
Microsoft.Security |
Modification avec rupture |
Modification sans rupture |
Cause
Un type visible de l'extérieur contient un champ en lecture seule visible de l'extérieur qui constitue un type référence mutable.
Description de la règle
Un type mutable est un type dont les données d'instance peuvent être modifiées. La classe System.Text.StringBuilder est un exemple de type référence mutable. Il contient des membres qui peuvent modifier la valeur d'une instance de la classe. La classe System.String est un exemple de type référence immuable. Après son instanciation, sa valeur ne peut plus changer.
Le modificateur en lecture seule (readonly (référence C#) en C-, ReadOnly (Visual Basic) en Visual Basic et const (C++) en C++) sur un champ de type référence (pointeur en C++) empêche le remplacement du champ par une instance différente du type de référence. Cependant, le modificateur n'empêche pas les données d'instance du champ d'être modifiées par le type référence.
Les champs de tableau en lecture seule sont exemptés de cette règle, mais engendrent en revanche une violation de la règle CA2105 : Les champs de tableau ne doivent pas être en lecture seule.
Comment corriger les violations
Pour corriger une violation de cette règle, supprimez le modificateur en lecture seule ou, si une modification sans rupture est acceptable, remplacez le champ par un type immuable.
Quand supprimer les avertissements
Il est possible de supprimer sans risque un avertissement de cette règle si le type du champ est immuable.
Exemple
L'exemple suivant présente une déclaration de champ qui provoque une violation de cette règle.
Imports System
Imports System.Text
Namespace SecurityLibrary
Public Class MutableReferenceTypes
Shared Protected ReadOnly SomeStringBuilder As StringBuilder
Shared Sub New()
SomeStringBuilder = New StringBuilder()
End Sub
End Class
End Namespace
using System;
using System.Text;
namespace SecurityLibrary
{
public class MutableReferenceTypes
{
static protected readonly StringBuilder SomeStringBuilder;
static MutableReferenceTypes()
{
SomeStringBuilder = new StringBuilder();
}
}
}
using namespace System;
using namespace System::Text;
namespace SecurityLibrary
{
public ref class MutableReferenceTypes
{
protected:
static StringBuilder^ const SomeStringBuilder =
gcnew StringBuilder();
private:
static MutableReferenceTypes()
{
}
};
}