Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- CurrentCulture
- CurrentCultureIgnoreCase
- InvariantCulture
- InvariantCultureIgnoreCase
- OrdinalIgnoreCase
İ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.
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 none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA2249.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.