CA1870: Använd en cachelagrad "SearchValues"-instans
Property | Värde |
---|---|
Regel-ID | CA1870 |
Title | Använda en cachelagrad "SearchValues"-instans |
Kategori | Prestanda |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
En IndexOfAny
eller ContainsAny
-metod anropas med många konstanta värden på ett sätt som kan dra nytta av att använda SearchValues i stället.
Regeln flaggar inte anrop som använder upp till fem värden, eftersom de redan använder en optimal implementering.
Regelbeskrivning
Att använda en cachelagrad SearchValues<T> instans är effektivare än att skicka värden till IndexOfAny
eller ContainsAny
direkt.
Så här åtgärdar du överträdelser
Skapa och cachelagrat en SearchValues<T> instans i ett static readonly
fält och skicka sedan instansen IndexOfAny
till eller ContainsAny
anropa i stället.
Det finns en kodkorrigering som utför den här omvandlingen automatiskt.
Exempel
Följande kodfragment visar två överträdelser av 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");
}
Följande kodfragment åtgärdar överträdelserna:
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);
}
Om det finns flera anrop till IndexOfAny
med samma uppsättning värden s_myValues
, bör återanvändas.
När du ska ignorera varningar
Det är säkert att ignorera den här varningen om prestanda inte är ett problem.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1870
// The code that's violating the rule is on this line.
#pragma warning restore CA1870
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1870.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.