CA2249: String.IndexOf yerine String.Contains kullanmayı göz önünde bulundurun

Özellik Değer
Kural Kimliği CA2249
Başlık String.IndexOf yerine String.Contains kullanmayı düşünün
Kategori Kullanım
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Öneri olarak

Neden

Bu kural, bir alt dizenin varlığını veya yokluğunu denetlemek için sonucun kullanıldığı çağrıları IndexOf bulur ve okunabilirliği geliştirmek için bunun yerine kullanılmasını Contains önerir.

Kural açıklaması

IndexOf Sonucun değerine eşit veya ondan büyük veya eşit 0olup olmadığını denetlemek için -1 kullanıldığında, çağrının yerine performans üzerinde bir etki bırakmadan güvenli bir şekilde Contains değiştirilebilir.

Kullanılan aşırı yüklemeye bağlı IndexOf olarak, önerilen düzeltme bir comparisonType bağımsız değişken eklenebilir:

Aşırı Önerilen düzeltme
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)*

* dışında StringComparison.Ordinalherhangi bir StringComparison sabit listesi değeri:

İhlalleri düzeltme

İhlal el ile düzeltilebilir veya bazı durumlarda Visual Studio'da kodu düzeltmek için Hızlı Eylemler kullanılabilir.

Örnekler

Aşağıdaki iki kod parçacığı C# dilinde kuralın tüm olası ihlallerini ve bunların nasıl düzeltileceğini gösterir:

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

Bahşiş

Visual Studio'da bu kural için bir kod düzeltmesi kullanılabilir. Bunu kullanmak için imleci ihlalin üzerine getirin ve Ctrl+ tuşuna (nokta) basın. 'string'i kullanmayı göz önünde bulundurun'u seçin . 'string' yerine Contains' (İçerir). Sunulan seçenekler listesinden IndexOf' öğesini seçin.

Code fix for CA2249 - Consider using 'string.Contains' instead of 'string.IndexOf'

Uyarıların ne zaman bastırılması gerekiyor?

Kod okunabilirliğini geliştirmek sorun değilse, bu kuralın ihlalini engellemek güvenlidir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

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

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

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

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Ayrıca bkz.