CA2227 : Les propriétés de collection doivent être en lecture seule

Propriété Value
Identificateur de la règle CA2227
Titre Les propriétés de collection doivent être en lecture seule
Catégorie Utilisation
Le correctif est cassant ou non cassant Rupture
Activé par défaut dans .NET 8 Non

Cause

Une propriété accessible en écriture et visible en externe est d’un type qui implémente System.Collections.ICollection. Cette règle ignore les tableaux, les indexeurs (propriétés nommées « Item »), les collections immuables, les collections en lecture seule et les ensembles d’autorisations.

Description de la règle

Une propriété de collection accessible en écriture permet à un utilisateur de remplacer la collection par une autre. Une propriété en lecture seule ou init-only empêche le remplacement de la collection, mais permet quand même de définir individuellement ses membres. Si l’objectif est de remplacer la collection, le modèle de conception recommandé consiste à inclure une méthode pour supprimer tous les éléments de la collection et une autre pour remplir à nouveau la collection. Pour obtenir un exemple de ce modèle, consultez les méthodes Clear et AddRange de la classe System.Collections.ArrayList.

La sérialisation binaire et la sérialisation XML prennent toutes deux en charge les propriétés en lecture seule qui sont des collections. La classe System.Xml.Serialization.XmlSerializer présente des exigences spécifiques pour les types qui implémentent ICollection et System.Collections.IEnumerable de façon à être sérialisables.

Comment corriger les violations

Pour corriger une violation de cette règle, rendez la propriété en lecture seule ou init-only. Si la conception l’exige, ajoutez des méthodes pour effacer et remplir à nouveau la collection.

Quand supprimer les avertissements

Vous pouvez supprimer l’avertissement si la propriété fait partie d’une classe DTO (Data Transfer Object).

Sinon, ne supprimez aucun avertissement de cette règle.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable CA2227
// The code that's violating the rule is on this line.
#pragma warning restore CA2227

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.CA2227.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemple

L’exemple suivant illustre un type doté d’une propriété de collection accessible en écriture et montre comment remplacer directement la collection. Il présente également la méthode recommandée de remplacement d’une propriété de collection en lecture seule à l’aide des méthodes Clear et AddRange.

public class WritableCollection
{
    public ArrayList SomeStrings
    {
        get;

        // This set accessor violates rule CA2227.
        // To fix the code, remove this set accessor or change it to init.
        set;
    }

    public WritableCollection()
    {
        SomeStrings = new ArrayList(new string[] { "one", "two", "three" });
    }
}

class ReplaceWritableCollection
{
    static void Main2227()
    {
        ArrayList newCollection = new ArrayList(new string[] { "a", "new", "collection" });

        WritableCollection collection = new WritableCollection();

        // This line of code demonstrates how the entire collection
        // can be replaced by a property that's not read only.
        collection.SomeStrings = newCollection;

        // If the intent is to replace an entire collection,
        // implement and/or use the Clear() and AddRange() methods instead.
        collection.SomeStrings.Clear();
        collection.SomeStrings.AddRange(newCollection);
    }
}
Public Class WritableCollection

    ' This property violates rule CA2227.
    ' To fix the code, add the ReadOnly modifier to the property:
    ' ReadOnly Property SomeStrings As ArrayList
    Property SomeStrings As ArrayList

    Sub New()
        SomeStrings = New ArrayList(New String() {"one", "two", "three"})
    End Sub

End Class

Class ViolatingVersusPreferred

    Shared Sub Main2227()
        Dim newCollection As New ArrayList(New String() {"a", "new", "collection"})

        Dim collection As New WritableCollection()

        ' This line of code demonstrates how the entire collection
        ' can be replaced by a property that's not read only.
        collection.SomeStrings = newCollection

        ' If the intent is to replace an entire collection,
        ' implement and/or use the Clear() and AddRange() methods instead.
        collection.SomeStrings.Clear()
        collection.SomeStrings.AddRange(newCollection)
    End Sub

End Class

Voir aussi