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 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:

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.