Share via


CA1870: Een exemplaar van SearchValues in de cache gebruiken

Eigenschappen Weergegeven als
Regel-id CA1870
Titel Een exemplaar van SearchValues in de cache gebruiken
Categorie Prestaties
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Als suggestie

Oorzaak

Een IndexOfAny of ContainsAny methode wordt aangeroepen met veel constante waarden op een manier die in plaats daarvan kan profiteren van het gebruik SearchValues ervan.

De regel markeert geen aanroepen die maximaal vijf waarden gebruiken, omdat die al een optimale implementatie gebruiken.

Beschrijving van regel

Het gebruik van een exemplaar in de cache SearchValues<T> is efficiënter dan het doorgeven van waarden aan IndexOfAny of ContainsAny rechtstreeks.

Schendingen oplossen

Maak en cache een SearchValues<T> exemplaar in een static readonly veld en geef die instantie vervolgens door aan de IndexOfAny of ContainsAny aanroep.

Er is een codefixer beschikbaar waarmee deze transformatie wordt uitgevoerd.

Opmerking

In het volgende codefragment ziet u twee schendingen van 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");
}

Met het volgende codefragment worden de schendingen opgelost:

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

Als er meerdere aanroepen IndexOfAny met dezelfde set waarden zijn, s_myValues moet u deze opnieuw gebruiken.

Wanneer waarschuwingen onderdrukken

Het is veilig om deze waarschuwing te onderdrukken als de prestaties geen probleem zijn.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.