Aracılığıyla paylaş


CA1862: Büyük/küçük harfe duyarlı olmayan dize karşılaştırmaları gerçekleştirmek için 'StringComparison' yöntemi aşırı yüklemelerini kullanın

Özellik Değer
Kural Kimliği CA1862
Başlık Büyük/küçük harfe duyarlı olmayan dize karşılaştırmaları gerçekleştirmek için 'StringComparison' yöntemi aşırı yüklemelerini kullanın
Kategori Performans
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Öneri olarak

Neden

Kod, iki dizeyi büyük/küçük harfe duyarsız bir şekilde karşılaştırmak için önce , ToLowerInvariant(), ToUpper()veya ToUpperInvariant() dizeleri bir veya her ikisinde de çağırırToLower().

Kural açıklaması

Kod , , ToLowerInvariant()ToUpper()veya ToUpperInvariant()çağırdığında ToLower()bir ayırma gerçekleştirilir. Bu yöntemleri çağırmanın tek nedeni büyük/küçük harfe duyarsız dize karşılaştırması veya araması gerçekleştirmekse, ayırma gereksizdir. Bunun yerine, bir alıp değerlerden birini *IgnoreCase belirten bir StringComparison dize karşılaştırma yöntemi çağırabilirsiniz.

İhlalleri düzeltme

, , ToUpper()ToLowerInvariant()veya ToUpperInvariant()çağrısını ToLower()kaldırın ve yöntemlerden birini StringComparer veya bağımsız StringComparison değişken alan aşağıdaki yöntemlerden birini çağırın:

Not

  • Kodunuzu, bağımsız değişken alan StringComparison bir aşırı yükleme kullanacak şekilde değiştirirseniz, bu davranışta küçük değişikliklere neden olabilir. Bu değişikliği yaparsanız veya Visual Studio ampul önerisini kabul ederseniz kapsamlı testler yapmanız önemlidir.
  • Dizelerin kültürel açıdan hassas bir şekilde karşılaştırılması gerekmiyorsa, geçirmeyi StringComparison.OrdinalIgnoreCasegöz önünde bulundurun.

Örnek

Aşağıdaki örnekte kuralın ihlali gösterilmektedir:

string s1 = "aBc";
string s2 = "aBC";

int _ = s1.ToUpper().CompareTo(s2.ToUpper());
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"

Dim i As Integer = s1.ToUpper().CompareTo(s2.ToUpper())

Aşağıdaki örnekte, ihlali düzelten kod gösterilmektedir:

string s1 = "aBc";
string s2 = "aBC";

int _ = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2);
Dim s1 As String = "aBc"
Dim s2 As String = "aBC"

Dim i As Integer = StringComparer.CurrentCultureIgnoreCase.Compare(s1, s2)

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

Performans önemli değilse, bu kuraldan gelen uyarıların gizlenmesi güvenlidir.

Entity Framework Core (EF Core) kullanıyorsanız, bir dizeyi karşılaştırarak veritabanını sorguladığınız senaryolar için bu kuralı gizlemeniz gerekir. EF Core, bağımsız değişken alan StringComparison gibi String.Equals(String, StringComparison) bir yöntem kullanırsanız bir özel durum oluşturur çünkü bu tür sorgular SQL'e çevrilemez. Daha fazla bilgi için bkz . Yerleşik .NET dize işlemlerinin çevirisi.

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 CA1862
// The code that's violating the rule is on this line.
#pragma warning restore CA1862

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.CA1862.severity = none

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