Aracılığıyla paylaş


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
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 Keys veya Values koleksiyonları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.

Ayrıca bkz.