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.
| Ö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' metodu aşırı yüklemelerini kullanın |
| Kategori | Performans |
| Düzeltme bozucu ya da bozmayan olabilir | Kesintisiz |
| .NET 10'da varsayılan olarak etkin | Öneri olarak |
| Geçerli diller | C# ve Visual Basic |
Neden
Kod, iki dizeyi büyüklük/küçüklük fark etmeksizin karşılaştırmak için önce ToLower(), ToLowerInvariant(), ToUpper() veya ToUpperInvariant() çağrılır.
Kural açıklaması
Kod ToLower(), ToLowerInvariant(), ToUpper() veya ToUpperInvariant() çağırdığında 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 StringComparison alıp *IgnoreCase değerlerinden birini belirten bir dize karşılaştırma yöntemi çağırabilirsiniz.
İhlalleri düzeltme
ToLower(), ToLowerInvariant(), ToUpper() veya ToUpperInvariant() çağrısını kaldırın ve StringComparer yöntemlerinden birini veya StringComparison bağımsız değişkeni 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, StringComparison bağımsız değişken alan bir aşırı yükleme kullanacak şekilde değiştirirseniz, davranışta ince 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, StringComparison.OrdinalIgnoreCase geçirmeyi düşünün.
Ö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, StringComparison bağımsız değişkeni alan String.Equals(String, StringComparison) gibi bir yöntem kullandığınızda bir hata (exception) fırlatır çü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.