Udostępnij za pośrednictwem


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 łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Jako sugestia
Zastosowane języki C# i Visual Basic

Przyczyna

Kod porównuje dwa ciągi, ignorując wielkość liter, wywołując najpierw ToLower(), ToLowerInvariant(), ToUpper() lub ToUpperInvariant() na jednym lub obu ciągach.

Opis reguły

Gdy kod wywołuje ToLower(), ToLowerInvariant(), ToUpper() lub ToUpperInvariant(), alokacja 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 ToLower(), ToLowerInvariant(), ToUpper() lub ToUpperInvariant(), i wywołaj jedną z metod StringComparer lub jedną z następujących metod, które przyjmują argument StringComparison:

Uwaga

  • Jeśli zmienisz kod, aby używał przeciążenia przyjmującego argument StringComparison, może to spowodować subtelne zmiany w zachowaniu. 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 elementu StringComparison.OrdinalIgnoreCase.

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) z argumentem StringComparison, ponieważ takie zapytania nie zostaną przetłumaczone na SQL. Aby uzyskać więcej informacji, zobacz Tłumaczenie wbudowanych operacji ciągów .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.