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 | CA1841 |
| Başlık | Sözlük İçeren yöntemleri tercih et |
| 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
Bu kural, bir IDictionary<TKey,TValue> nesnesinin Keys veya Values koleksiyonundaki Contains yöntemine yapılan çağrıların, sözlüğün kendisinde ContainsKey veya ContainsValue yöntemine yapılan çağrılarla değiştirilebileceği durumları bulur.
Kural açıklaması
Koleksiyonlar üzerinden Contains çağırmak, genellikle sözlük üzerinde Keys veya Values çağırmaktan ya da sözlüğün kendisinde ContainsKey veya ContainsValue çağırmaktan daha pahalı olabilir.
- Birçok sözlük uygulaması, anahtar ve değer koleksiyonlarını tembel bir şekilde oluşturur, bu da
KeysveyaValueskoleksiyonlarına erişmenin ekstra ayırmalara neden olabileceği anlamına gelir. - Anahtarlar veya değerler koleksiyonu, ICollection<T> üzerindeki yöntemleri gizlemek için açık arabirim uygulaması kullanıyorsa, IEnumerable<T> üzerinde bir uzantı yöntemi çağırıyor olabilirsiniz. Bu, özellikle anahtar koleksiyonuna erişirken performansın düşmesine neden olabilir. Çoğu sözlük uygulaması anahtarları için hızlı bir O(1) kapsama denetimi sağlayabilirken
Contains, üzerindeki IEnumerable<T> uzantı yöntemi genellikle yavaş bir O(n) kapsama denetimi yapar.
İhlalleri düzeltme
İhlalleri düzeltmek için, dictionary.Keys.Contains veya dictionary.Values.Contains çağrılarını sırasıyla dictionary.ContainsKey veya dictionary.ContainsValue ile değiştirin.
Aşağıdaki kod parçacığında ihlal örnekleri ve bunların nasıl düzeltileceğini gösterilmektedir.
using System.Collections.Generic;
// Importing this namespace brings extension methods for IEnumerable<T> into scope.
using System.Linq;
class Example
{
void Method()
{
var dictionary = new Dictionary<string, int>();
// Violation
dictionary.Keys.Contains("hello world");
// Fixed
dictionary.ContainsKey("hello world");
// Violation
dictionary.Values.Contains(17);
// Fixed
dictionary.ContainsValue(17);
}
}
Imports System.Collection.Generic
' Importing this namespace brings extension methods for IEnumerable(Of T) into scope.
' Note that in Visual Basic, this namespace is often imported automatically throughout the project.
Imports System.Linq
Class Example
Private Sub Method()
Dim dictionary = New Dictionary(Of String, Of Integer)
' Violation
dictionary.Keys.Contains("hello world")
' Fixed
dictionary.ContainsKey("hello world")
' Violation
dictionary.Values.Contains(17)
' Fixed
dictionary.ContainsValue(17)
End Sub
End Class
Uyarıların ne zaman bastırılması gerekiyor?
Söz konusu kod performans açısından kritik değilse, bu kuraldan gelen uyarıların gizlenmesi 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 CA1841
// The code that's violating the rule is on this line.
#pragma warning restore CA1841
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.CA1841.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.