CA2249: рекомендуется использовать String.Contains вместо String.IndexOf
Свойство | Значение |
---|---|
Идентификатор правила | CA2249 |
Заголовок | Попробуйте использовать String.Contains вместо String.IndexOf. |
Категория | Использование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предложение |
Причина
Это правило находит вызовы IndexOf, где результат используется для проверки наличия или отсутствия подстроки, и предлагает использовать Contains для улучшения удобочитаемости.
Описание правила
Если IndexOf используется, чтобы проверить, равен ли результат -1
либо он больше или равен 0
, вызов можно заменитьContains без влияния на производительность.
В зависимости от используемой перегрузки IndexOf предлагаемое исправление может получить добавленный аргумент comparisonType
:
Перегрузка | Предлагаемое исправление |
---|---|
String.IndexOf(char) |
String.Contains(char) |
String.IndexOf(string) |
String.Contains(string, StringComparison.CurrentCulture) |
String.IndexOf(char, StringComparison.Ordinal) |
String.Contains(char) |
String.IndexOf(string, StringComparison.Ordinal) |
String.Contains(string) |
String.IndexOf(char, NON StringComparison.Ordinal) * |
String.Contains(char, NON StringComparison.Ordinal) * |
String.IndexOf(string, NON StringComparison.Ordinal) * |
String.Contains(string, NON StringComparison.Ordinal) * |
* Любое StringComparison
значение перечисления, отличное от StringComparison.Ordinal
:
- CurrentCulture
- CurrentCultureIgnoreCase
- InvariantCulture
- InvariantCultureIgnoreCase
- OrdinalIgnoreCase
Устранение нарушений
Нарушение можно устранить вручную. В некоторых случаях для исправления кода в Visual Studio можно использовать быстрые действия.
Примеры
В следующих двух фрагментах кода показаны все возможные нарушения правила в C# и способы их устранения:
using System;
class MyClass
{
void MyMethod()
{
string str = "My text";
bool found;
// No comparisonType in char overload, so no comparisonType added in resulting fix
found = str.IndexOf('x') == -1;
found = str.IndexOf('x') >= 0;
// No comparisonType in string overload, adds StringComparison.CurrentCulture to resulting fix
found = str.IndexOf("text") == -1;
found = str.IndexOf("text") >= 0;
// comparisonType equal to StringComparison.Ordinal, removes the argument
found = str.IndexOf('x', StringComparison.Ordinal) == -1;
found = str.IndexOf('x', StringComparison.Ordinal) >= 0;
found = str.IndexOf("text", StringComparison.Ordinal) == -1;
found = str.IndexOf("text", StringComparison.Ordinal) >= 0;
// comparisonType different than StringComparison.Ordinal, preserves the argument
found = str.IndexOf('x', StringComparison.OrdinalIgnoreCase) == -1;
found = str.IndexOf('x', StringComparison.CurrentCulture) >= 0;
found = str.IndexOf("text", StringComparison.InvariantCultureIgnoreCase) == -1;
found = str.IndexOf("text", StringComparison.InvariantCulture) >= 0;
// Suggestion message provided, but no automatic fix offered, must be fixed manually
int index = str.IndexOf("text");
if (index == -1)
{
Console.WriteLine("'text' Not found.");
}
}
}
using System;
class MyClass
{
void MyMethod()
{
string str = "My text";
bool found;
// No comparisonType in char overload, so no comparisonType added in resulting fix
found = !str.Contains('x');
found = str.Contains('x');
// No comparisonType in string overload, adds StringComparison.CurrentCulture to resulting fix
found = !string.Contains("text", StringComparison.CurrentCulture);
found = string.Contains("text", StringComparison.CurrentCulture);
// comparisonType equal to StringComparison.Ordinal, removes the argument
found = !string.Contains('x');
found = string.Contains('x');
found = !string.Contains("text");
found = string.Contains("text");
// comparisonType different than StringComparison.Ordinal, preserves the argument
;found = !string.Contains('x', StringComparison.OrdinalIgnoreCase)
found = string.Contains('x', StringComparison.CurrentCulture);
found = !string.Contains("text", StringComparison.InvariantCultureIgnoreCase);
found = string.Contains("text", StringComparison.InvariantCulture);
// This case had to be manually fixed
if (!str.Contains("text"))
{
Console.WriteLine("'text' Not found.");
}
}
}
Совет
Для этого правила в Visual Studio доступно исправление кода. Чтобы использовать его, поместите курсор на нарушение и нажмите клавиши CTRL+ (период). В списке вариантов выберите Попробуйте использовать String.Contains вместо String.IndexOf.
Когда лучше отключить предупреждения
Можно отключить предупреждения для этого правила, если улучшение удобочитаемости кода не является проблемой.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2249
// The code that's violating the rule is on this line.
#pragma warning restore CA2249
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2249.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.