CA1831: usare AsSpan anziché indicizzatori basati su intervallo per la stringa quando appropriato

Proprietà valore
ID regola CA1831
Title Usare AsSpan invece di indicizzatori basati su Range per la stringa quando appropriato
Categoria Prestazioni
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come avviso

Causa

Un indicizzatore di intervallo viene usato in una stringa e il valore viene assegnato in modo implicito a ReadOnlySpan<char>.

Descrizione regola

Questa regola viene attivata quando si usa un indicizzatore di intervallo su una stringa e lo si assegna a un tipo span. L'indicizzatore di intervallo in un Span<T> è un'operazione di non copiaSlice, ma per l'indicizzatore di Sliceintervallo in una stringa, il metodo Substring verrà usato anziché . In questo modo viene creata una copia della parte richiesta della stringa. Questa copia in genere non è necessaria quando viene usata in modo implicito come ReadOnlySpan<T> valore o ReadOnlyMemory<T> . Se non è prevista una copia, usare il AsSpan metodo 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

Conversione implicita:

ReadOnlySpan<char> slice = str[a..b];

Non rileva

Conversione esplicita:

ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];

Come correggere le violazioni

Per correggere una violazione di questa regola, usare AsSpan anziché l'indicizzatore Rangebasato sulla stringa per evitare di creare copie di dati non necessarie.

public void TestMethod(string str)
{
    // The violation occurs
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation fixed with AsSpan extension method
    ReadOnlySpan<char> slice = str.AsSpan()[1..3];
    ...
}

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 stringa dall'elenco di opzioni presentate.

Code fix for CA1831 - Use AsSpan instead of Range-based indexers when appropriate

È anche possibile aggiungere un cast esplicito per evitare questo avviso.

public void TestMethod(string str)
{
    // The violation occurs.
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation avoided with explicit casting.
    ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
    ...
}

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

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

Per disabilitare questa intera categoria di regole, impostare la gravità per la categoria su none nel file di configurazione.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none

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

Vedi anche