CA2227: Le proprietà di raccolte devono essere in sola lettura
Proprietà | valore |
---|---|
ID regola | CA2227 |
Title | Le proprietà di raccolte devono essere in sola lettura |
Categoria | Utilizzo |
La correzione causa un'interruzione o meno | Interruzione |
Abilitato per impostazione predefinita in .NET 9 | 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