CA2227: Sammlungseigenschaften sollten schreibgeschützt sein.
Eigenschaft | Wert |
---|---|
Regel-ID | CA2227 |
Titel | Sammlungseigenschaften sollten schreibgeschützt sein. |
Kategorie | Verwendung |
Fix führt oder führt nicht zur Unterbrechung | Breaking |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Eine extern sichtbare, beschreibbare Eigenschaft ist ein Typ, der System.Collections.ICollection implementiert. Diese Regel ignoriert Arrays, Indexer (Eigenschaften mit dem Namen „Item“), unveränderliche Auflistungen, schreibgeschützte Auflistungen und Berechtigungssätze.
Regelbeschreibung
Eine schreibbare Auflistungseigenschaft ermöglicht es Benutzern, die Auflistung durch eine andere Auflistung zu ersetzen. Eine schreibgeschützte (InitOnly) Eigenschaft sorgt dafür, dass die Auflistung nicht mehr ersetzt wird, lässt aber dennoch das Festlegen einzelner Member zu. Wenn das Ersetzen der Auflistung eines der Ziele ist, besteht das bevorzugte Entwurfsmuster darin, eine Methode zum Entfernen aller Elemente aus der Auflistung und eine Methode zum erneuten Auffüllen der Auflistung einzuschließen. Ein Beispiel für dieses Muster finden Sie unter den Clear- und AddRange-Methoden der System.Collections.ArrayList-Klasse.
Sowohl die binäre als auch die XML-Serialisierung unterstützen schreibgeschützte Eigenschaften, die Auflistungen sind. Die System.Xml.Serialization.XmlSerializer-Klasse verfügt über bestimmte Anforderungen für Typen, die ICollection und System.Collections.IEnumerable implementieren, um serialisierbar zu sein.
Behandeln von Verstößen
Legen Sie fest, dass die Eigenschaft schreibgeschützt (InitOnly) ist, um einen Verstoß gegen diese Regel zu korrigieren. Wenn der Entwurf dies erfordert, fügen Sie Methoden hinzu, um die Auflistung zu löschen und neu aufzufüllen.
Wann sollten Warnungen unterdrückt werden?
Sie können die Warnung unterdrücken, wenn die Eigenschaft Teil einer Datenübertragungsobjeks (DTO)-Klasse ist.
Andernfalls sollten Sie keine Warnungen dieser Regel unterdrücken.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA2227
// The code that's violating the rule is on this line.
#pragma warning restore CA2227
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA2227.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Beispiel
Das folgende Beispiel zeigt einen Typ mit einer beschreibbaren Auflistungseigenschaft und zeigt, wie die Auflistung direkt ersetzt werden kann. Außerdem zeigt es die bevorzugte Methode zum Ersetzen einer schreibgeschützten Auflistungseigenschaft mithilfe Clear
- und AddRange
-Methoden.
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