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