Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA1841 |
| Judul | Lebih Suka Kamus Berisi metode |
| Kategori | Performa |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Sebagai saran |
| Bahasa yang berlaku | C# dan Visual Basic |
Penyebab
Aturan ini menemukan panggilan metode Contains pada kumpulan Keys atau Values dari IDictionary<TKey,TValue> yang dapat diganti dengan panggilan metode ContainsKey atau ContainsValue pada kamus itu sendiri.
Deskripsi aturan
Memanggil Contains dalam koleksi Keys atau Values seringkali dapat lebih mahal secara komputasi dibandingkan memanggil ContainsKey atau ContainsValue dalam kamus itu sendiri.
- Banyak implementasi kamus secara malas menginstansiasi koleksi kunci dan nilai, yang berarti bahwa mengakses koleksi
KeysatauValuesdapat mengakibatkan alokasi tambahan. - Anda mungkin akhirnya memanggil metode ekstensi pada IEnumerable<T> jika koleksi kunci atau nilai menggunakan implementasi antarmuka secara 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
Containsmetode 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.