CA1870: Użyj buforowanego wystąpienia "SearchValues"

Właściwości Wartość
Identyfikator reguły CA1870
Tytuł Używanie buforowanego wystąpienia "SearchValues"
Kategoria Wydajność
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

Metoda IndexOfAny or ContainsAny jest wywoływana z wieloma wartościami stałymi w sposób, który może skorzystać z użycia SearchValues .

Reguła nie flaguje wywołań, które używają maksymalnie pięciu wartości, ponieważ używają już optymalnej implementacji.

Opis reguły

Użycie wystąpienia buforowanego SearchValues<T> jest bardziej wydajne niż przekazywanie wartości do IndexOfAny lub ContainsAny bezpośrednio.

Jak naprawić naruszenia

Utwórz i buforuj SearchValues<T> wystąpienie w static readonly polu, a następnie przekaż to wystąpienie do wywołania IndexOfAny lub ContainsAny .

Dostępny jest program naprawiający kod, który wykonuje tę transformację.

Przykład

Poniższy fragment kodu przedstawia dwa naruszenia 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");
}

Poniższy fragment kodu naprawia naruszenia:

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);
}

Jeśli istnieje wiele wywołań metody IndexOfAny z tym samym zestawem wartości, s_myValues należy użyć ponownie.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć to ostrzeżenie, jeśli wydajność nie jest problemem.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA1870
// The code that's violating the rule is on this line.
#pragma warning restore CA1870

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA1870.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.