CA2249: Rozważ użycie ciągu.Contains zamiast String.IndexOf
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2249 |
Tytuł | Rozważ użycie metody String.Contains zamiast String.IndexOf |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Jako sugestia |
Przyczyna
Ta reguła lokalizuje wywołania, w IndexOf których wynik jest używany do sprawdzania obecności lub braku podciągów, i sugeruje użycie Contains zamiast tego w celu zwiększenia czytelności.
Opis reguły
Gdy IndexOf służy do sprawdzania, czy wynik jest równy -1
lub większy lub równy 0
, wywołanie można bezpiecznie zastąpić Contains bez wpływu na wydajność.
W zależności od używanego IndexOf przeciążenia sugerowana poprawka może uzyskać comparisonType
argument dodany:
Przeładować | Sugerowana poprawka |
---|---|
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) * |
* Dowolna StringComparison
wartość wyliczenia inna niż StringComparison.Ordinal
:
- CurrentCulture
- CurrentCultureIgnoreCase
- InvariantCulture
- InvariantCultureIgnoreCase
- OrdinalIgnoreCase
Jak naprawić naruszenia
Naruszenie można naprawić ręcznie lub, w niektórych przypadkach, za pomocą szybkich akcji w celu naprawienia kodu w programie Visual Studio.
Przykłady
Następujące dwa fragmenty kodu pokazują wszystkie możliwe naruszenia reguły w języku C# i sposób ich naprawiania:
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.");
}
}
}
Napiwek
Poprawka kodu jest dostępna dla tej reguły w programie Visual Studio. Aby go użyć, umieść kursor na naruszeniu i naciśnij Ctrl+. (kropka). Wybierz pozycję Rozważ użycie ciągu . Zawiera" zamiast "string". IndexOf z listy przedstawionych opcji.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć naruszenie tej reguły, jeśli poprawa czytelności kodu nie jest problemem.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2249
// The code that's violating the rule is on this line.
#pragma warning restore CA2249
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2249.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.