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 |
| Golongan | Performa |
| Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
| Diaktifkan secara default di .NET 10 | 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
KeysatauValueskoleksi 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
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.