CA2104 : Ne déclarez pas les types référence mutables en lecture seule

Élément Valeur
ID de la règle CA2104
Category Microsoft.Security
Modification avec rupture Sans rupture

Notes

La règle CA2104 est obsolète et sera supprimée dans une version ultérieure de Visual Studio. Elle ne sera pas implémentée en tant qu’analyseur en raison de l’analyse complexe nécessaire pour déterminer l’immuabilité réelle d’un type.

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.

Notes

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

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. Elle contient des membres qui peuvent modifier la valeur d’une instance de la classe. Un exemple de type référence immuable est la classe System.String. Une fois qu’elle a été instanciée, sa valeur ne peut jamais changer.

Le modificateur en lecture seule (readonly en C#, ReadOnly en Visual Basic et const en C++) sur un champ de type référence (ou pointeur en C++) empêche le champ d’être remplacé par une autre instance du type de référence. Toutefois, le modificateur n’empêche pas les données d’instance du champ d’être modifiées par le type référence.

Cette règle peut montrer par inadvertance une violation d’un type qui est, en fait, immuable. Dans ce cas, il est sûr de supprimer l’avertissement.

Les champs de tableau en lecture seule sont exemptés de cette règle, mais provoquent plutôt 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 un changement cassant est acceptable, remplacez le champ par un type immuable.

Quand supprimer les avertissements

Il est sûr de supprimer un avertissement de cette règle si le type de champ est immuable.

Exemple

L’exemple suivant montre une déclaration de champ qui provoque une violation de cette règle :

using System;
using System.Text;

namespace SecurityLibrary
{
    public class MutableReferenceTypes
    {
        static protected readonly StringBuilder SomeStringBuilder;

        static MutableReferenceTypes()
        {
            SomeStringBuilder = new StringBuilder();
        }
    }
}