Aracılığıyla paylaş


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

Mülk 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 Kesintisiz
.NET 9'da 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 artırmak amacıyla bunun yerine Contains kullanılmasını önerir.

Kural açıklaması

IndexOf sonucu -1'e eşit veya 0'den büyük ya da ona eşit olup olmadığını kontrol etmek için kullanıldığında, çağrının yerine performansa bir etki yapmadan güvenli bir şekilde Contains değiştirilebilir.

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

Aşırı yük Ö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)*

* StringComparison dışında herhangi bir StringComparison.Ordinal 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 = !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.");
        }
    }
}

İpucu

Visual Studio'da bu kural için bir kod düzeltmesi kullanılabilir. Bunu kullanmak için imleci ihlalin üzerine getirin ve Ctrl+. tuşlarına basın. Sunulan seçenekler listesinden 'string.IndexOf' yerine 'string.Contains' kullanmayı göz önünde bulundurun seçeneğini seçin.

CA2249 için kod düzeltmesi - 'string.IndexOf' yerine 'string.Contains' kullanmayı düşünün

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.