CA1841: Sözlük İçeren yöntemleri tercih edin
Özellik | Değer |
---|---|
Kural Kimliği | CA1841 |
Başlık | Sözlük İçeren yöntemleri tercih et |
Kategori | Performans |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 9'da varsayılan olarak etkin | Öneri olarak |
Neden
Bu kural, sözlüğün Keys
kendisinde bir Contains
veya yöntemine yapılan çağrıyla değiştirilebilen veya Values
koleksiyonundaki IDictionary<TKey,TValue> bir ContainsKey
ContainsValue
yönteme yapılan çağrıları bulur.
Kural açıklaması
veya koleksiyonunda çağırmak Contains
genellikle sözlüğü çağırmaktan Keys
veya ContainsValue
sözlüğün kendisinden daha ContainsKey
pahalı olabilir:Values
- Birçok sözlük uygulaması, anahtar ve değer koleksiyonlarının örneğini oluşturur ve bu da veya
Values
koleksiyonuna erişmeninKeys
fazladan ayırmalara neden olabileceği anlamına gelir. - Anahtarlar veya değerler koleksiyonu üzerindeki IEnumerable<T> yöntemleri gizlemek için açık arabirim uygulaması kullanıyorsa üzerinde bir uzantı yöntemi ICollection<T>çağırabilirsiniz. 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, veya dictionary.Values.Contains
çağrılarını dictionary.Keys.Contains
sırasıyla veya dictionary.ContainsValue
ile dictionary.ContainsKey
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 none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1841.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.