Condividi tramite


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 una correzione del codice che esegue automaticamente 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.