CA1862: используйте перегрузки метода StringComparison для сравнения строк без учета регистра.
Свойство | Значение |
---|---|
Идентификатор правила | CA1862 |
Заголовок | Используйте перегрузки метода StringComparison для сравнения строк без учета регистра |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | Как предложение |
Причина
Код сравнивает две строки без учета регистра путем первого вызова ToLower(), ToLowerInvariant()ToUpper()или ToUpperInvariant() одной или обеих строк.
Описание правила
При вызове ToLower()кода , ToUpper()ToLowerInvariant()или ToUpperInvariant()выделении. Если единственной причиной вызова этих методов является выполнение сравнения строк или поиска без учета регистра, выделение не требуется. Вместо этого можно вызвать метод сравнения строк, который принимает StringComparison и указать одно из значений *IgnoreCase
.
Устранение нарушений
Удалите вызов ToLower(), ToLowerInvariant()ToUpper()или ToUpperInvariant()или вызов одного из StringComparer методов или один из следующих методов, который принимает 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)
Примечание.
- Если вы изменяете код на использование перегрузки, которая принимает StringComparison аргумент, это может привести к незначительным изменениям в поведении. Важно провести тщательное тестирование, если вы вносите это изменение или принимаете предложение лампочки Visual Studio.
- Если строки не нужно сравнивать с учетом культуры, рассмотрите возможность передачи StringComparison.OrdinalIgnoreCase.
Пример
В следующем примере показано нарушение правила:
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())
В следующем примере показан код, который устраняет нарушение:
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)
Когда лучше отключить предупреждения
Это безопасно для подавления предупреждений из этого правила, если производительность не является проблемой.
Если вы используете Entity Framework Core (EF Core), это правило следует отключить для сценариев, в которых выполняется запрос к базе данных, сравнивая строку. EF Core создает исключение, если используется такой метод, как String.Equals(String, StringComparison)StringComparison аргумент, так как он не преобразует такие запросы в SQL. Дополнительные сведения см. в разделе "Перевод встроенных строковых операций .NET".
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1862
// The code that's violating the rule is on this line.
#pragma warning restore CA1862
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1862.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.