Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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:
- 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, 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.