Share via


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 8 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.

Voorbeeld

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

Zie ook