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 |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | 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.
È 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.
Regole correlate
- CA1832: usare AsSpan o AsMemory anziché indicizzatori basati su range per ottenere la parte ReadOnlySpan o ReadOnlyMemory di una matrice
- CA1833: usare AsSpan o AsMemory invece di indicizzatori basati su intervallo per ottenere la parte Span o Memory di una matrice