Megosztás a következőn keresztül:


CA2249: Fontolja meg a String.Contains használatát a String.IndexOf helyett

Ingatlan Érték
Szabályazonosító CA2249
Cím Fontolja meg a String.Contains használatát a String.IndexOf helyett
Kategória Használat
A javítás törő vagy nem rontja el a működést Nem törhető
Alapértelmezés szerint engedélyezve a .NET 9-ben Javaslatként

Ok

Ez a szabály azokat a IndexOf hívásokat keresi meg, ahol az eredményt egy részszöveg meglétének vagy hiányának ellenőrzésére használják, és azt javasolja, hogy inkább Contains használjátok az olvashatóság javítása érdekében.

Szabály leírása

Ha a IndexOf annak ellenőrzésére szolgál, hogy az eredmény -1 egyenlő-e vagy nagyobb, vagy egyenlő 0, akkor a hívás biztonságosan helyettesíthető a Contains-kal anélkül, hogy hatással lenne a teljesítményre.

A használt túlterheléstől függően IndexOf a javasolt javítás egy argumentumot adhat hozzá comparisonType-ként:

Túlterhelés Javasolt javítás
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)*

* Bármely StringComparison felsorolási érték, kivéve StringComparison.Ordinal:

Szabálysértések kijavítása

A szabálysértés manuálisan is kijavítható, vagy bizonyos esetekben a Gyorsműveletek segítségével kijavíthatja a kódot a Visual Studióban.

Példák

Az alábbi két kódrészlet a szabály C#-ban való összes lehetséges megsértését és azok kijavítását mutatja be:

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.");
        }
    }
}

Tipp.

Ehhez a szabályhoz kódjavítás érhető el a Visual Studióban. A használathoz helyezze a kurzort a szabálysértésre, és nyomja le a Ctrl+. (pont) billentyűt. Válassza a bemutatott lehetőségek listájából: Fontolja meg a 'string.Contains' használatát a 'string.IndexOf' helyett.

CA2249 kódjavítás – Fontolja meg a 'string.Contains' használatát a 'string.IndexOf' helyett

Mikor kell letiltani a figyelmeztetéseket?

Ha a kód olvashatóságának javítása nem jelent problémát, nyugodtan el lehet tiltani a szabály megsértését.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

#pragma warning disable CA2249
// The code that's violating the rule is on this line.
#pragma warning restore CA2249

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_diagnostic.CA2249.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

Lásd még