CA1819: Eigenschaften sollten keine Arrays zurückgeben.
Eigenschaft | Wert |
---|---|
Regel-ID | CA1819 |
Titel | Eigenschaften sollten keine Arrays zurückgeben. |
Kategorie | Leistung |
Fix führt oder führt nicht zur Unterbrechung | Breaking |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Eine Eigenschaft gibt ein Array zurück.
Standardmäßig werden mit dieser Regel nur extern sichtbare Eigenschaften und Typen überprüft, aber dies ist konfigurierbar.
Regelbeschreibung
Von Eigenschaften zurückgegebene Arrays sind nicht schreibgeschützt, auch wenn die Eigenschaft schreibgeschützt ist. Damit das Array gegen Manipulationen geschützt bleibt, muss die Eigenschaft eine Kopie des Arrays zurückgeben. Normalerweise verstehen die Benutzer nicht, welche negativen Auswirkungen der Aufruf einer solchen Eigenschaft auf die Leistung hat. Insbesondere kann die Eigenschaft als indizierte Eigenschaft verwendet werden.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, stellen Sie entweder die Eigenschaft als Methode dar, oder ändern Sie die Eigenschaft, um eine Auflistung zurückzugeben.
Wann sollten Warnungen unterdrückt werden?
Sie können eine Warnung unterdrücken, die für eine Eigenschaft eines Attributs ausgelöst wird, das von der Attribute-Klasse abgeleitet ist. Attribute können Eigenschaften enthalten, die Arrays zurückgeben, aber keine Eigenschaften enthalten, die Auflistungen zurückgeben.
Sie können die Warnung unterdrücken, wenn die Eigenschaft Teil einer Datenübertragungsobjeks (DTO)-Klasse ist.
Andernfalls sollten Sie keine Warnung 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 CA1819
// The code that's violating the rule is on this line.
#pragma warning restore CA1819
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.CA1819.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Konfigurieren des zu analysierenden Codes
Mithilfe der folgenden Option können Sie konfigurieren, für welche Teile Ihrer Codebasis diese Regel ausgeführt werden soll.
Sie können diese Option nur für diese Regel, für alle zutreffenden Regeln oder für alle zutreffenden Regeln in dieser Kategorie (Leistung) konfigurieren. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.
Einschließen bestimmter API-Oberflächen
Sie können je nach Zugänglichkeit festlegen, für welche Bestandteile Ihrer Codebasis diese Regel ausgeführt wird. Sie können beispielsweise festlegen, dass die Regel nur für die nicht öffentliche API-Oberfläche ausgeführt werden soll, indem Sie einer EDITORCONFIG-Datei in Ihrem Projekt das folgende Schlüssel-Wert-Paar hinzufügen:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Beispiel für einen Verstoß
Das folgende Beispiel zeigt eine Eigenschaft, die gegen diese Regel verstößt:
public class Book
{
private string[] _Pages;
public Book(string[] pages)
{
_Pages = pages;
}
public string[] Pages
{
get { return _Pages; }
}
}
Public Class Book
Public Sub New(ByVal pages As String())
Me.Pages = pages
End Sub
Public ReadOnly Property Pages() As String()
End Class
Um einen Verstoß gegen diese Regel zu beheben, stellen Sie entweder die Eigenschaft als Methode dar, oder ändern Sie die Eigenschaft, um eine Auflistung zurückzugeben, anstatt eines Arrays.
Ändern Sie die Eigenschaft in eine Methode
Im folgenden Beispiel wird die Verletzung durch Ändern der Eigenschaft in eine Methode behoben:
Public Class Book
Private _Pages As String()
Public Sub New(ByVal pages As String())
_Pages = pages
End Sub
Public Function GetPages() As String()
' Need to return a clone of the array so that consumers
' of this library cannot change its contents
Return DirectCast(_Pages.Clone(), String())
End Function
End Class
public class Book
{
private string[] _Pages;
public Book(string[] pages)
{
_Pages = pages;
}
public string[] GetPages()
{
// Need to return a clone of the array so that consumers
// of this library cannot change its contents
return (string[])_Pages.Clone();
}
}
Ändern Sie die Eigenschaft, um eine Auflistung zurückzugeben
Im folgenden Beispiel wird die Verletzung durch Ändern der Eigenschaft in eine Methode behoben, um eine System.Collections.ObjectModel.ReadOnlyCollection<T> zurückzugeben:
public class Book
{
private ReadOnlyCollection<string> _Pages;
public Book(string[] pages)
{
_Pages = new ReadOnlyCollection<string>(pages);
}
public ReadOnlyCollection<string> Pages
{
get { return _Pages; }
}
}
Public Class Book
Public Sub New(ByVal pages As String())
Me.Pages = New ReadOnlyCollection(Of String)(pages)
End Sub
Public ReadOnly Property Pages() As ReadOnlyCollection(Of String)
End Class
Benutzern das Ändern einer Eigenschaft gestatten
Möglicherweise möchten Sie dem Consumer der Klasse gestatten, eine Eigenschaft zu ändern. Das folgende Beispiel zeigt eine Lesen-/Schreiben-Eigenschaft, die gegen diese Regel verstößt:
public class Book
{
private string[] _Pages;
public Book(string[] pages)
{
_Pages = pages;
}
public string[] Pages
{
get { return _Pages; }
set { _Pages = value; }
}
}
Public Class Book
Public Sub New(ByVal pages As String())
Me.Pages = pages
End Sub
Public Property Pages() As String()
End Class
Im folgenden Beispiel wird die Verletzung durch Ändern der Eigenschaft in eine Methode behoben, um eine System.Collections.ObjectModel.Collection<T> zurückzugeben:
Public Class Book
Public Sub New(ByVal pages As String())
Me.Pages = New Collection(Of String)(pages)
End Sub
Public ReadOnly Property Pages() As Collection(Of String)
End Class
public class Book
{
private Collection<string> _Pages;
public Book(string[] pages)
{
_Pages = new Collection<string>(pages);
}
public Collection<string> Pages
{
get { return _Pages; }
}
}