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.