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 causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | Come suggerimento |
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 di non 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 ReadOnlySpan<T> valore o ReadOnlyMemory<T> . Se una copia non è prevista, usare il AsSpan metodo o AsMemory per evitare la copia non necessaria. Se la copia è prevista, assegnarla 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.
È 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.
Regole correlate
- CA1831: usare AsSpan anziché indicizzatori basati su intervallo per la stringa quando appropriato
- CA1833: usare AsSpan o AsMemory invece di indicizzatori basati su intervallo per ottenere la parte Span o Memory di una matrice