CA1833: Verwenden Sie „AsSpan“ oder „AsMemory“ anstelle von Range-basierten Indexern zum Abrufen eines Span- oder Memory-Teils eines Arrays.

Eigenschaft Wert
Regel-ID CA1833
Titel Verwenden Sie „AsSpan“ oder „AsMemory“ anstelle von Range-basierten Indexern zum Abrufen eines Span- oder Memory-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 Span<T> oder Memory<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 Span<T>- oder Memory<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:

  • Span<SomeT> slice = arr[a..b];
  • Memory<SomeT> slice = arr[a..b];

Erkennt nicht

Explizite Konvertierungen:

  • Span<SomeT> slice = (Span<SomeT>)arr[a..b];
  • Memory<SomeT> slice = (Memory<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
        Span<byte> tmp2 = arr[0..5];
        Memory<byte> tmp4 = arr[5..10];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violations fixed with AsSpan or AsMemory accordingly
        Span<byte> tmp2 = arr.AsSpan()[0..5];
        Memory<byte> tmp4 = arr.AsMemory()[5..10];
        ...
    }
}

Tipp

Für diese Regel ist ein Codefix in Visual Studio verfügbar. Zur Verwendung platzieren Sie den Cursor auf dem Verstoß, und drücken Sie STRG+. (Punkt). Wählen Sie in der Liste der angezeigten Optionen die Option AsMemory anstelle des bereichsbasierten Indexers in einem Array verwenden aus.

Code fix for CA1833 - Use AsSpan or AsMemory instead of Range-based indexers for getting Span or Memory 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
        Span<byte> tmp1 = arr[0..5];
        Memory<byte> tmp2 = arr[5..10];
        ...
    }
}
class C
{
    public void TestMethod(byte[] arr)
    {
        // The violation fixed with explicit casting
        Span<byte> tmp1 = (Span<byte>)arr[0..5];
        Memory<byte> tmp2 = (Memory<byte>)arr[5..10];
        ...
    }
}

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 CA1833
// The code that's violating the rule is on this line.
#pragma warning restore CA1833

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.CA1833.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Siehe auch