CA2227: Le proprietà di raccolte devono essere in sola lettura

Proprietà valore
ID regola CA2227
Titolo Le proprietà di raccolte devono essere in sola lettura
Categoria Utilizzo
Correzione che causa un'interruzione o un'interruzione Interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Una proprietà visibile esternamente scrivibile è di un tipo che implementa System.Collections.ICollection. Questa regola ignora matrici, indicizzatori (proprietà con il nome 'Item'), raccolte non modificabili, raccolte readonly e set di autorizzazioni.

Descrizione regola

Una proprietà raccolta scrivibile consente a un utente di sostituire la raccolta con una raccolta completamente diversa. Una proprietà di sola lettura o di sola lettura impedisce la sostituzione della raccolta, ma consente comunque di impostare i singoli membri. Se la sostituzione della raccolta è un obiettivo, il modello di progettazione preferito consiste nell'includere un metodo per rimuovere tutti gli elementi dalla raccolta e un metodo per ripopolare la raccolta. Per un esempio di questo modello, vedere i Clear metodi e AddRange della System.Collections.ArrayList classe .

La serializzazione binaria e XML supporta le proprietà di sola lettura che sono raccolte. La System.Xml.Serialization.XmlSerializer classe ha requisiti specifici per i tipi che implementano ICollection e System.Collections.IEnumerable per poter essere serializzabili.

Come correggere le violazioni

Per correggere una violazione di questa regola, impostare la proprietà di sola lettura o init.To fix a violation of this rule, make the property read-only or init-only. Se la progettazione lo richiede, aggiungere metodi per cancellare e ripopolare la raccolta.

Quando eliminare gli avvisi

È possibile eliminare l'avviso se la proprietà fa parte di una classe DTO (Data Transfer Object).

In caso contrario, non eliminare gli avvisi da questa regola.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempio

Nell'esempio seguente viene illustrato un tipo con una proprietà raccolta scrivibile e viene illustrato come la raccolta può essere sostituita direttamente. Inoltre, mostra il modo preferito per sostituire una proprietà di raccolta di sola lettura utilizzando Clear i metodi e 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

Vedi anche