Partager via


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 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 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()
        {
        }
    };
}