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 9 | 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:
- String.Compare(String, String, StringComparison)
- String.Contains(String, StringComparison)
- String.EndsWith(String, StringComparison)
- String.Equals(String, StringComparison)
- String.IndexOf
- String.LastIndexOf
- String.Replace(String, String, StringComparison)
- String.StartsWith(String, StringComparison)
- Compare(Uri, Uri, UriComponents, UriFormat, StringComparison)
- StringSegment.Compare(StringSegment, StringSegment, StringComparison)
- StringSegment.EndsWith(String, StringComparison)
- StringSegment.Equals
- StringSegment.StartsWith(String, StringComparison)
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.