Condividi tramite


CA1832: usare AsSpan o AsMemory anziché indicizzatori basati su range per ottenere la parte ReadOnlySpan o ReadOnlyMemory di una matrice

Proprietà valore
ID regola CA1832
Title Usare AsSpan o AsMemory invece di indicizzatori basati su Range per ottenere la parte ReadOnlySpan o ReadOnlyMemory di una matrice
Categoria Prestazioni
La correzione causa un'interruzione o meno Non rompente
Abilitato per impostazione predefinita in .NET 10 Come suggerimento
Linguaggi applicabili C# e Visual Basic

Causa

Quando si usa un indicizzatore di intervallo in una matrice e si assegna in modo implicito il valore a ReadOnlySpan<T> o ReadOnlyMemory<T>.

Descrizione regola

L'indicizzatore di intervalli in un Span<T> oggetto è un'operazione senza copia Slice. Tuttavia, per l'indicizzatore di intervalli in una matrice, il metodo GetSubArray verrà usato invece di Slice, che produce una copia della parte richiesta della matrice. Questa copia in genere non è necessaria quando viene usata in modo implicito come valore di ReadOnlySpan<T> o di ReadOnlyMemory<T>. Se una copia non è prevista, usare il AsSpan metodo o AsMemory per evitare la copia non necessaria. Se si intende copiare, assegnare la copia prima a una variabile locale o aggiungere un cast esplicito.

L'analizzatore segnala solo quando viene usato un cast implicito sul risultato dell'operazione dell'indicizzatore di intervalli.

Rileva

Conversioni implicite:

  • ReadOnlySpan<SomeT> slice = arr[a..b];
  • ReadOnlyMemory<SomeT> slice = arr[a..b];

Non rileva

Conversioni esplicite:

  • ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];
  • ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<SomeT>)arr[a..b];

Come correggere le violazioni

Per correggere una violazione di questa regola, utilizzare il AsSpan metodo di estensione o AsMemory per evitare di creare copie di dati non necessarie.

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];
        ...
    }
}

Suggerimento

Una correzione del codice è disponibile per questa regola in Visual Studio. Per usarlo, posizionare il cursore sulla violazione e premere CTRL+. (punto). Scegliere Usa AsSpan anziché l'indicizzatore basato su intervallo in una matrice dall'elenco di opzioni presentate.

Correzione del codice per CA1832: usare AsSpan o AsMemory anziché gli indicizzatori basati su range per ottenere la parte ReadOnlySpan o ReadOnlyMemory di una matrice

È anche possibile evitare questo avviso aggiungendo un cast esplicito.

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];
        ...
    }
}

Quando eliminare gli avvisi

È possibile eliminare una violazione di questa regola se è prevista la creazione di una copia.

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

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedi anche