CA1870: Usare un'istanza di 'SearchValues' memorizzata nella cache
Proprietà | valore |
---|---|
ID regola | CA1870 |
Title | Usare un'istanza di 'SearchValues' memorizzata nella cache |
Categoria | Prestazioni |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | Come suggerimento |
Causa
Un IndexOfAny
metodo o ContainsAny
viene chiamato con molti valori costanti in modo da trarre vantaggio dall'uso SearchValues .
La regola non contrassegna le chiamate che usano fino a cinque valori, perché quelle usano già un'implementazione ottimale.
Descrizione regola
L'uso di un'istanza memorizzata nella SearchValues<T> cache è più efficiente rispetto al passaggio diretto di valori a IndexOfAny
o ContainsAny
direttamente.
Come correggere le violazioni
Creare e memorizzare nella cache un'istanza SearchValues<T> in un static readonly
campo, quindi passare tale IndexOfAny
istanza alla chiamata o ContainsAny
.
È disponibile un sistema di correzione del codice che esegue questa trasformazione.
Esempio
Il frammento di codice seguente mostra due violazioni di CA1870:
static readonly char[] MyValues = new[] { 'a', 'b', 'c', 'x', 'y', 'z' };
static int IndexOfMyValues(ReadOnlySpan<char> text)
{
return text.IndexOfAny(MyValues);
}
static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
return !text.ContainsAnyExcept("abcxyz");
}
Il frammento di codice seguente corregge le violazioni:
private static readonly SearchValues<char> s_myValues = SearchValues.Create("abcxyz");
static int IndexOfMyValues(ReadOnlySpan<char> text)
{
return text.IndexOfAny(s_myValues);
}
static bool ContainsOnlyMyValues(ReadOnlySpan<char> text)
{
return !text.ContainsAnyExcept(s_myValues);
}
Se sono presenti più chiamate a IndexOfAny
con lo stesso set di valori, s_myValues
deve essere riutilizzato.
Quando eliminare gli avvisi
Se le prestazioni non sono un problema, è possibile eliminare questo avviso.
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 CA1870
// The code that's violating the rule is on this line.
#pragma warning restore CA1870
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.CA1870.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.