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 9'da 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 , ToLower(), ToLowerInvariant()veya ToUpper() dizeleri bir veya her ikisinde de çağırırToUpperInvariant().
Kural açıklaması
Kod , , ToLower()ToLowerInvariant()veya ToUpper()çağırdığında ToUpperInvariant()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 StringComparison belirten bir *IgnoreCase
dize karşılaştırma yöntemi çağırabilirsiniz.
İhlalleri düzeltme
, , ToLower()ToLowerInvariant()veya ToUpper()çağrısını ToUpperInvariant()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:
- String.Compare(String, String, StringComparison)
- String.Contains(String, StringComparison)
- String.EndsWith(String, StringComparison)
- String.Equals(String, StringComparison)
- String.IndexOf
- String.LastIndexOf
- String.Replace(String, String, StringComparison)
- String.StartsWith(String, StringComparison)
- Compare(Uri, Uri, UriComponents, UriFormat, StringComparison)
- StringSegment.Compare(StringSegment, StringSegment, StringComparison)
- StringSegment.EndsWith(String, StringComparison)
- StringSegment.Equals
- StringSegment.StartsWith(String, StringComparison)
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 String.Equals(String, StringComparison) gibi 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 none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1862.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.