Поделиться через


CA1862: используйте перегрузки метода StringComparison для сравнения строк без учета регистра.

Свойство Значение
Идентификатор правила CA1862
Заголовок Используйте перегрузки метода StringComparison для сравнения строк без учета регистра
Категория Производительность
Исправление является критическим или не критическим неразрывный
Включен по умолчанию в .NET 10 Как предложение
Применимые языки C# и Visual Basic

Причина

Код сравнивает две строки без учета регистра, вызывая сначала ToLower(), ToLowerInvariant(), ToUpper() или ToUpperInvariant() для одной или обеих строк.

Описание правила

Когда вызываются ToLower(), ToLowerInvariant(), ToUpper() или ToUpperInvariant(), производится выделение памяти. Если единственной причиной вызова этих методов является выполнение сравнения строк или поиска без учета регистра, выделение памяти не требуется. Вместо этого можно вызвать метод сравнения строк, который принимает StringComparison и указать одно из значений *IgnoreCase .

Устранение нарушений

Удалите вызов ToLower(), ToLowerInvariant(), ToUpper() или ToUpperInvariant(), и вызовите один из методов StringComparer или один из следующих методов, который принимает 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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.