CA1832: Verwenden Sie „AsSpan“ oder „AsMemory“ anstelle von Range-basierten Indexern zum Abrufen eines ReadOnlySpan- oder ReadOnlyMemory-Teils eines Arrays.
Eigenschaft | Wert |
---|---|
Regel-ID | CA1832 |
Titel | Verwenden Sie „AsSpan“ oder „AsMemory“ anstelle von Range-basierten Indexern zum Abrufen eines ReadOnlySpan- oder ReadOnlyMemory-Teils eines Arrays. |
Kategorie | Leistung |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Als Vorschlag |
Ursache
Wenn ein Bereichsindexer für ein Array verwendet und der Wert implizit zu ReadOnlySpan<T> oder ReadOnlyMemory<T> zugewiesen wird.
Regelbeschreibung
Der Bereichsindexer in einer Span<T>-Struktur ist ein Slice-Vorgang, der nicht kopiert werden kann. Bei einem Bereichsindexer in einem Array wird jedoch die Methode GetSubArray anstelle von Slice verwendet, wodurch eine Kopie des angeforderten Teils des Arrays erzeugt wird. Diese Kopie ist in der Regel unnötig, wenn diese implizit als ReadOnlySpan<T>- oder ReadOnlyMemory<T>-Wert verwendet wird. Wenn eine Kopie nicht beabsichtigt ist, verwenden Sie die AsSpan- oderAsMemory-Methode, um unnötige Kopien zu vermeiden. Wenn die Kopie beabsichtigt ist, weisen Sie zuerst einer lokalen Variablen zu, oder fügen Sie eine explizite Umwandlung hinzu.
Das Analysetool gibt nur eine Meldung aus, wenn eine implizite Umwandlung für das Ergebnis des Bereichs-Indexer-Vorgangs verwendet wird.
Erkennt
Implizite Konvertierungen:
ReadOnlySpan<SomeT> slice = arr[a..b];
ReadOnlyMemory<SomeT> slice = arr[a..b];
Erkennt nicht
Explizite Konvertierungen:
ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];
ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<SomeT>)arr[a..b];
Behandeln von Verstößen
So beheben Sie eine Verletzung dieser Regel: Verwenden Sie die Erweiterungsmethoden AsSpan oder AsMemory, um zu vermeiden, dass unnötige Datenkopien erstellt werden.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs for both statements below
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violations fixed with AsSpan or AsMemory accordingly
ReadOnlySpan<byte> tmp1 = arr.AsSpan()[0..2];
ReadOnlyMemory<byte> tmp3 = arr.AsMemory()[5..8];
...
}
}
Tipp
Für diese Regel ist ein Codefix in Visual Studio verfügbar. Um ihn zu nutzen, muss der Cursor auf dem Verstoß platziert und Strg+. (Punkt) gedrückt werden. Wählen Sie in der Liste der angezeigten Optionen AsSpan anstelle des bereichsbasierten Indexers in einem Array verwenden aus.
Sie können diese Warnung auch vermeiden, indem Sie eine explizite Umwandlung hinzufügen.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violation fixed with explicit casting
ReadOnlySpan<byte> tmp1 = (ReadOnlySpan<byte>)arr[0..2];
ReadOnlyMemory<byte> tmp3 = (ReadOnlyMemory<byte>)arr[5..8];
...
}
}
Wann sollten Warnungen unterdrückt werden?
Es ist sicher, einen Verstoß gegen diese Regel zu unterdrücken, wenn das Erstellen einer Kopie beabsichtigt ist.
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 CA1832
// The code that's violating the rule is on this line.
#pragma warning restore CA1832
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.CA1832.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Ähnliche Regeln
- CA1831: Verwenden Sie für Zeichenfolgen bei Bedarf anstelle von Range-basierten Indexern „AsSpan“.
- CA1833: Verwenden Sie „AsSpan“ oder „AsMemory“ anstelle von Range-basierten Indexern zum Abrufen eines Span- oder Memory-Teils eines Arrays.