Bagikan melalui


CA1841: Kamus Pilihan Berisi metode

Properti Nilai
ID Aturan CA1841
Judul Lebih Suka Kamus Berisi metode
Golongan Performa
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Aturan ini menemukan panggilan ke Contains metode pada Keys atau Values kumpulan yang IDictionary<TKey,TValue> dapat diganti dengan panggilan ke ContainsKey metode atau ContainsValue pada kamus itu sendiri.

Deskripsi aturan

Contains Panggilan pada Keys koleksi atau Values seringkali bisa lebih mahal daripada memanggil ContainsKey atau ContainsValue pada kamus itu sendiri:

  • Banyak implementasi kamus dengan malas membuat instans koleksi kunci dan nilai, yang berarti bahwa mengakses Keys atau Values koleksi dapat mengakibatkan alokasi tambahan.
  • Anda mungkin akhirnya memanggil metode ekstensi jika IEnumerable<T> kunci atau koleksi nilai menggunakan implementasi antarmuka eksplisit untuk menyembunyikan metode pada ICollection<T>. Hal ini dapat menyebabkan penurunan performa, terutama saat mengakses koleksi kunci. Sebagian besar implementasi kamus dapat memberikan pemeriksaan penahanan O(1) yang cepat untuk kunci, sementara Contains metode ekstensi pada IEnumerable<T> biasanya melakukan pemeriksaan penahanan O(n) yang lambat.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran, ganti panggilan ke dictionary.Keys.Contains atau dictionary.Values.Contains dengan panggilan ke dictionary.ContainsKey atau dictionary.ContainsValue, masing-masing.

Cuplikan kode berikut menunjukkan contoh pelanggaran, dan cara memperbaikinya.

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

Kapan harus menekan peringatan

Aman untuk menekan peringatan dari aturan ini jika kode yang bersangkutan tidak kritis terhadap performa.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA1841
// The code that's violating the rule is on this line.
#pragma warning restore CA1841

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA1841.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Baca juga