Share via


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 8 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.

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.