CA2227: Verzamelingseigenschappen mogen alleen-lezen zijn
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2227 |
Titel | Verzamelingseigenschappen mogen alleen-lezen zijn |
Categorie | Gebruik |
Oplossing is brekend of niet-brekend | Breken |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een extern zichtbare, beschrijfbare eigenschap is van een type dat implementeert System.Collections.ICollection. Deze regel negeert matrices, indexeerfuncties (eigenschappen met de naam Item), onveranderbare verzamelingen, leesbare verzamelingen en machtigingensets.
Beschrijving van regel
Met een beschrijfbare verzamelingseigenschap kan een gebruiker de verzameling vervangen door een volledig andere verzameling. Met een eigenschap alleen-lezen of alleen-lezen wordt de verzameling niet meer vervangen, maar kan de afzonderlijke leden nog steeds worden ingesteld. Als het vervangen van de verzameling een doel is, is het voorkeursontwerppatroon een methode op te nemen om alle elementen uit de verzameling te verwijderen en een methode om de verzameling opnieuw te vullen. Bekijk de Clear en AddRange methoden van de System.Collections.ArrayList klasse voor een voorbeeld van dit patroon.
Zowel binaire als XML-serialisatie ondersteunen alleen-lezeneigenschappen die verzamelingen zijn. De System.Xml.Serialization.XmlSerializer klasse heeft specifieke vereisten voor typen die kunnen worden geïmplementeerd ICollection en System.Collections.IEnumerable om serialiseerbaar te zijn.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, maakt u de eigenschap alleen-lezen of alleen-lezen. Als het ontwerp dit vereist, voegt u methoden toe om de verzameling te wissen en opnieuw te vullen.
Wanneer waarschuwingen onderdrukken
U kunt de waarschuwing onderdrukken als de eigenschap deel uitmaakt van een DTO-klasse (Data Transfer Object).
Anders onderdrukt u geen waarschuwingen van deze regel.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA2227
// The code that's violating the rule is on this line.
#pragma warning restore CA2227
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA2227.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Opmerking
In het volgende voorbeeld ziet u een type met een beschrijfbare verzamelingseigenschap en ziet u hoe de verzameling rechtstreeks kan worden vervangen. Daarnaast ziet u de voorkeursmethode voor het vervangen van een eigenschap alleen-lezenverzameling met behulp Clear
van en 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