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 9 | 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
atauValues
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.