CA1862: Użyj przeciążeń metody "StringComparison", aby wykonać porównania ciągów bez uwzględniania wielkości liter
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1862 |
Tytuł | Użyj przeciążeń metody "StringComparison", aby wykonać porównania ciągów bez uwzględniania wielkości liter |
Kategoria | Wydajność |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Jako sugestia |
Przyczyna
Kod porównuje dwa ciągi w sposób bez uwzględniania wielkości liter, wywołując ToLower()najpierw ciągi , ToLowerInvariant(), ToUpper()lub ToUpperInvariant() w jednym lub obu ciągach.
Opis reguły
Gdy kod wywołuje ToLower(), , ToUpper()ToLowerInvariant()lub ToUpperInvariant(), alokację jest wykonywana. Jeśli jedyną przyczyną wywołania tych metod jest przeprowadzenie porównania ciągów bez uwzględniania wielkości liter lub wyszukiwania, alokacja jest niepotrzebna. Zamiast tego można wywołać metodę porównania ciągów, która przyjmuje StringComparison element i określa jedną z *IgnoreCase
wartości.
Jak naprawić naruszenia
Usuń wywołanie metody , ToLower(), ToUpper()ToLowerInvariant()lub ToUpperInvariant(), i wywołaj jedną z następujących metod lub jedną z StringComparer następujących metod, która przyjmuje 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)
Uwaga
- Jeśli zmienisz kod tak, aby używał przeciążenia, które przyjmuje StringComparison argument, może to spowodować subtelne zmiany zachowania. Ważne jest przeprowadzenie dokładnych testów, jeśli wprowadzisz tę zmianę lub zaakceptujesz sugestię żarówki programu Visual Studio.
- Jeśli ciągi nie muszą być porównywane w sposób wrażliwy kulturowo, rozważ przekazanie StringComparison.OrdinalIgnoreCaseelementu .
Przykład
W poniższym przykładzie pokazano naruszenie reguły:
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())
W poniższym przykładzie pokazano kod, który naprawia naruszenie:
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)
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenia z tej reguły, jeśli wydajność nie jest problemem.
Jeśli używasz programu Entity Framework Core (EF Core), należy pominąć tę regułę w scenariuszach, w których wykonujesz zapytania dotyczące bazy danych, porównując ciąg. Program EF Core zgłasza wyjątek, jeśli używasz metody takiej jak String.Equals(String, StringComparison) StringComparison argument, ponieważ nie przetłumaczy takich zapytań na język SQL. Aby uzyskać więcej informacji, zobacz Tłumaczenie wbudowanych operacji ciągów platformy .NET.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1862
// The code that's violating the rule is on this line.
#pragma warning restore CA1862
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1862.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.