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şmenin Keys 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.ContainsValueile 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.

Ayrıca bkz.