Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2249 řekl: |
Název | Zvážit možnost místo string.IndexOf použít string.Contains |
Kategorie | Využití |
Oprava je buď způsobující chybu, nebo bezchybová | Nezlomitelný |
Povoleno ve výchozím nastavení v .NET 9 | Jako návrh |
Příčina
Toto pravidlo vyhledá volání, ve IndexOf kterých se výsledek používá ke kontrole přítomnosti nebo nepřítomnosti podřetězce, a místo toho navrhuje použití Contains ke zlepšení čitelnosti.
Popis pravidla
Pokud se IndexOf používá ke kontrole, jestli je výsledek roven -1
nebo větší, nebo roven 0
, může být volání bezpečně nahrazeno Contains bez dopadu na výkon.
V závislosti na IndexOf použitém přetížení by navrhovaná oprava mohla zahrnovat přidání argumentu comparisonType
:
Přetížení | Navrhovaná oprava |
---|---|
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) * |
* Jakákoli jiná hodnota výčtu než StringComparison
StringComparison.Ordinal
:
- CurrentCulture
- CurrentCultureIgnoreCase
- InvariantCulture
- InvariantCultureIgnoreCase
- OrdinalIgnoreCase
Jak opravit porušení
Porušení může být buď opraveno ručně, nebo v některých případech pomocí rychlých akcí opravit kód v sadě Visual Studio.
Příklady
Následující dva fragmenty kódu ukazují všechna možná porušení pravidla v jazyce C# a postup jejich opravy:
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 = !str.Contains("text", StringComparison.CurrentCulture);
found = str.Contains("text", StringComparison.CurrentCulture);
// comparisonType equal to StringComparison.Ordinal, removes the argument
found = !str.Contains('x');
found = str.Contains('x');
found = !str.Contains("text");
found = str.Contains("text");
// comparisonType different than StringComparison.Ordinal, preserves the argument
found = !str.Contains('x', StringComparison.OrdinalIgnoreCase);
found = str.Contains('x', StringComparison.CurrentCulture);
found = !str.Contains("text", StringComparison.InvariantCultureIgnoreCase);
found = str.Contains("text", StringComparison.InvariantCulture);
// This case had to be manually fixed
if (!str.Contains("text"))
{
Console.WriteLine("'text' Not found.");
}
}
}
Návod
Oprava kódu je k dispozici pro toto pravidlo v sadě Visual Studio. Chcete-li ho použít, umístěte kurzor na porušení a stiskněte Ctrl+. (tečka). Vyberte možnost Využijte 'string.Contains' místo 'string.IndexOf' ze seznamu nabízených možností.
Kdy potlačit upozornění
Pokud zlepšení čitelnosti kódu není problém, je bezpečné potlačit porušení tohoto pravidla.
Potlačte upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2249
// The code that's violating the rule is on this line.
#pragma warning restore CA2249
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2249.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.