Dela via


CA1862: Använd metoden StringComparison för att utföra skiftlägesokänsliga strängjämförelser

Property Värde
Regel-ID CA1862
Title Använd metoden StringComparison överlagringar för att utföra skiftlägesokänsliga strängjämförelser
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

Koden jämför två strängar på ett skiftlägesokänsligt sätt genom att först anropa ToLower(), ToLowerInvariant(), ToUpper()eller ToUpperInvariant() på en eller båda strängarna.

Regelbeskrivning

När koden anropar ToLower(), ToLowerInvariant(), ToUpper()eller ToUpperInvariant(), utförs en allokering. Om den enda anledningen till att anropa dessa metoder är att utföra en skiftlägeskänslig strängjämförelse eller sökning är allokeringen onödig. I stället kan du anropa en strängjämförelsemetod som tar en StringComparison och anger ett av *IgnoreCase värdena.

Så här åtgärdar du överträdelser

Ta bort anropet till ToLower(), ToLowerInvariant(), ToUpper()eller och ToUpperInvariant()anropa någon av StringComparer metoderna eller någon av följande metoder som tar ett StringComparison argument:

Kommentar

  • Om du ändrar koden så att den använder en överlagring som tar ett StringComparison argument kan det orsaka subtila förändringar i beteendet. Det är viktigt att utföra noggranna tester om du gör den här ändringen eller accepterar Visual Studio-glödlampans förslag.
  • Om strängarna inte behöver jämföras på ett kulturellt känsligt sätt kan du överväga att skicka StringComparison.OrdinalIgnoreCase.

Exempel

I följande exempel visas ett brott mot regeln:

string s1 = "aBc";
string s2 = "aBC";

int _ = s1.ToUpper().CompareTo(s2.ToUpper());
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"

Dim i As Integer = s1.ToUpper().CompareTo(s2.ToUpper())

I följande exempel visas kod som åtgärdar överträdelsen:

string s1 = "aBc";
string s2 = "aBC";

int _ = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2);
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"

Dim i As Integer = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2)

När du ska ignorera varningar

Det är säkert att ignorera varningar från den här regeln om prestanda inte är ett problem.

Om du använder Entity Framework Core (EF Core) bör du utelämna den här regeln för scenarier där du kör frågor mot en databas genom att jämföra en sträng. EF Core utlöser ett undantag om du använder en metod som String.Equals(String, StringComparison) det tar ett StringComparison argument, eftersom det inte översätter sådana frågor till SQL. Mer information finns i Översättning av inbyggda .NET-strängåtgärder.

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 CA1862
// The code that's violating the rule is on this line.
#pragma warning restore CA1862

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.CA1862.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.