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.

Code fix for CA1832 - Use AsSpan or AsMemory instead of Range-based indexers for getting ReadOnlySpan or ReadOnlyMemory portion of an array

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.

Siehe auch