Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1862 |
| Заголовок | Используйте перегрузки метода StringComparison для сравнения строк без учета регистра |
| Категория | Производительность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предложение |
| Применимые языки | C# и Visual Basic |
Причина
Код сравнивает две строки без учета регистра, вызывая сначала ToLower(), ToLowerInvariant(), ToUpper() или ToUpperInvariant() для одной или обеих строк.
Описание правила
Когда вызываются ToLower(), ToLowerInvariant(), ToUpper() или 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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.