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.
Aturan performa mendukung pustaka dan aplikasi berkinerja tinggi.
Di bagian ini
| Aturan | Deskripsi |
|---|---|
| CA1802: Gunakan Harfiah Jika Sesuai | Field dideklarasikan sebagai statis dan hanya-baca (Shared dan ReadOnly dalam Visual Basic), dan diinisialisasi dengan nilai yang dapat dihitung pada waktu kompilasi. Karena nilai yang ditetapkan ke bidang yang ditargetkan dapat dihitung pada waktu kompilasi, ubah deklarasi menjadi bidang const (Const in Visual Basic) sehingga nilai dihitung pada waktu kompilasi, bukan pada runtime. |
| CA1805: Jangan inisialisasi yang tidak perlu | Runtime .NET menginisialisasi semua bidang jenis referensi ke nilai defaultnya sebelum menjalankan konstruktor. Dalam kebanyakan kasus, menginisialisasi field secara eksplisit dengan nilai default merupakan hal yang redundan, yang menambah biaya pemeliharaan dan dapat menurunkan kinerja (misalnya karena ukuran assembly yang lebih besar). |
| CA1806: Jangan abaikan hasil metode | Objek baru dibuat tetapi tidak pernah digunakan, atau metode yang membuat dan mengembalikan string baru dipanggil dan string baru tidak pernah digunakan, atau metode Component Object Model (COM) atau P/Invoke mengembalikan HRESULT atau kode kesalahan yang tidak pernah digunakan. |
| CA1810: Inisialisasi field statis tipe referensi secara langsung | Ketika jenis mendeklarasikan konstruktor statik eksplisit, kompilator just-in-time (JIT) menambahkan tanda centang ke setiap metode statik dan konstruktor instans dari jenis tersebut untuk memastikan bahwa konstruktor statik telah dipanggil sebelumnya. Pemeriksaan konstruktor statik dapat menurunkan performa. |
| CA1812: Hindari kelas internal yang tidak diinstansiasi | Instans dari jenis tingkat rakitan tidak dibuat oleh kode di rakitan. |
| CA1813: Hindari atribut yang tidak disegel | .NET menyediakan metode untuk mengambil atribut kustom. Secara default, metode ini mencari hierarki warisan atribut. Menyegel atribut menghilangkan pencarian melalui hierarki warisan dan dapat meningkatkan performa. |
| CA1814: Utamakan array bergerigi daripada array multidimensi | Larik bergerigi adalah larik yang elemen-elemennya adalah larik. Larik yang membentuk elemen dapat memiliki ukuran yang berbeda, yang dapat mengakibatkan ruang yang terbuang lebih sedikit untuk beberapa himpunan data. |
| CA1815: Ganti sama dengan dan sama dengan operator pada jenis nilai | Untuk jenis nilai, implementasi Equals yang diwariskan menggunakan pustaka Reflection dan membandingkan isi semua bidang. Refleksi memerlukan biaya komputasi yang mahal, dan membandingkan setiap bidang untuk kesetaraan mungkin tidak perlu. Jika Anda mengharapkan pengguna membandingkan atau mengurutkan instans, atau menggunakan instans sebagai kunci pada tabel hash, tipe nilai Anda harus mengimplementasikan Equals. |
| CA1819: Properti tidak boleh mengembalikan array | Larik yang dikembalikan oleh properti tidak dilindungi penulisan, meskipun properti bersifat baca-saja. Agar larik kebal terhadap manipulasi, properti harus mengembalikan salinan larik. Biasanya, pengguna tidak akan memahami implikasi negatif terhadap kinerja saat mengakses properti semacam itu. |
| CA1820: Periksa string kosong dengan menggunakan panjang string | Membandingkan string dengan menggunakan properti String.Length atau metode String.IsNullOrEmpty secara signifikan lebih cepat daripada menggunakan metode Equals. |
| CA1821: Hapus finalizer kosong | Sebisa mungkin, hindari finalizer karena adanya overhead performa tambahan yang diperlukan untuk melacak masa hidup objek. Sebuah finalizer kosong menimbulkan overhead tambahan tanpa manfaat apa pun. |
| CA1822: Tandai anggota sebagai statik | Anggota yang tidak mengakses data instans atau memanggil metode instans dapat ditandai sebagai statik (Dibagikan dalam Visual Basic). Setelah Anda menandai metode sebagai statis, kompilator akan menghasilkan titik pemanggilan non-virtual ke anggota ini. Hal ini dapat memberi Anda peningkatan performa yang terukur untuk kode yang sensitif terhadap performa. |
| CA1823: Hindari bidang privat yang tidak digunakan | Bidang privat terdeteksi yang tampaknya tidak dapat diakses di rakitan. |
| CA1824: Tandai rakitan dengan NeutralResourcesLanguageAttribute | Atribut NeutralResourcesLanguage memberi tahu Resource Manager tentang bahasa yang digunakan untuk menampilkan sumber daya untuk kultur netral pada suatu rakitan. Ini meningkatkan performa pencarian untuk sumber daya pertama yang Anda muat dan dapat mengurangi rangkaian pekerjaan Anda. |
| CA1825: Hindari alokasi larik berukuran nol | Menginisialisasi larik dengan panjang nol menyebabkan alokasi memori yang tidak perlu. Sebagai gantinya, gunakan instans larik kosong yang dialokasikan secara statik dengan memanggil Array.Empty. Alokasi memori dibagikan di semua pemanggilan metode ini. |
| CA1826: Gunakan properti, bukan metode Linq Enumerable | Metode LINQ Enumerable digunakan pada jenis yang mendukung properti yang setara dan lebih efisien. |
| CA1827: Jangan gunakan Count/LongCount jika Any dapat digunakan | Metode Count atau LongCount digunakan di mana metode Any akan lebih efisien. |
| CA1828: Jangan gunakan CountAsync/LongCountAsync saat AnyAsync dapat digunakan | Metode CountAsync atau LongCountAsync digunakan di mana metode AnyAsync akan lebih efisien. |
| CA1829: Gunakan properti Length/Count alih-alih metode Enumerable.Count | Metode LINQ Count digunakan pada jenis yang mendukung properti Length atau Count yang setara dan lebih efisien. |
| CA1830: Gunakan kelebihan beban metode Append dan Insert yang bertipe kuat pada StringBuilder | Append dan Insert menyediakan kelebihan beban untuk beberapa jenis di luar System.String. Jika memungkinkan, gunakan overload yang bertipe kuat alih-alih menggunakan ToString() dan overload berbasis string. |
| CA1831: Gunakan AsSpan alih-alih pengindeks berbasis Rentang untuk string jika sesuai | Saat menggunakan pengindeks rentang pada string dan secara implisit menetapkan nilai ke jenis karakter ReadOnlySpan<, metode > akan digunakan alih-alih Substring, yang menghasilkan salinan bagian yang diminta dari string.Slice |
| CA1832: Gunakan AsSpan atau AsMemory, bukan pengindeks berbasis Rentang untuk mendapatkan bagian ReadOnlySpan atau ReadOnlyMemory dari larik | Saat menggunakan pengindeks rentang pada larik dan secara implisit menetapkan nilai ke jenis ReadOnlySpan<T> atau ReadOnlyMemory<T>, metode GetSubArray akan digunakan sebagai ganti Slice, yang menghasilkan salinan bagian larik yang diminta. |
| CA1833: Gunakan AsSpan atau AsMemory daripada pengindeks berbasis Rentang untuk mendapatkan bagian Rentang atau Memori dari array | Saat menggunakan pengindeks rentang pada larik dan secara implisit menetapkan nilai ke jenis Span<T> atau Memory<T>, metode GetSubArray akan digunakan sebagai ganti Slice, yang menghasilkan salinan bagian larik yang diminta. |
| CA1834: Gunakan StringBuilder.Append(char) untuk string karakter tunggal |
StringBuilder memiliki overload Append yang menggunakan char sebagai argumennya. Utamakan memanggil overload char untuk meningkatkan performa. |
| CA1835: Lebih baik gunakan overload berbasis 'Memori' untuk 'ReadAsync' dan 'WriteAsync' | 'Stream' memiliki overload 'ReadAsync' yang menggunakan 'Memory<Byte>' sebagai argumen pertama, dan overload 'WriteAsync' yang menggunakan 'ReadOnlyMemory<Byte>' sebagai argumen pertama. Lebih baik memanggil overload berbasis memori, yang lebih efisien. |
CA1836: Pilih IsEmpty daripada Count jika tersedia |
Pilih properti IsEmpty yang lebih efisien daripada Count, Length, Count<TSource>(IEnumerable<TSource>), atau LongCount<TSource>(IEnumerable<TSource>) untuk menentukan apakah objek berisi item atau tidak. |
CA1837: Gunakan Environment.ProcessId, bukan Process.GetCurrentProcess().Id |
Environment.ProcessId lebih sederhana dan lebih cepat daripada Process.GetCurrentProcess().Id. |
CA1838: Hindari parameter StringBuilder untuk P/Invokes |
Marshalling StringBuilder selalu membuat salinan buffer native, sehingga menghasilkan beberapa alokasi memori untuk satu operasi marshalling. |
| CA1839: Gunakan Environment.ProcessPath, bukan Process.GetCurrentProcess().MainModule.FileName |
Environment.ProcessPath lebih sederhana dan lebih cepat daripada Process.GetCurrentProcess().MainModule.FileName. |
| CA1840: Gunakan Environment.CurrentManagedThreadId bukan Thread.CurrentThread.ManagedThreadId |
Environment.CurrentManagedThreadId lebih ringkas dan efisien daripada Thread.CurrentThread.ManagedThreadId. |
| CA1841: Utamakan metode Contains milik Dictionary | Memanggil Contains di kumpulan Keys atau Values mungkin sering kali lebih mahal daripada memanggil ContainsKey atau ContainsValue di kamus itu sendiri. |
| CA1842: Jangan gunakan 'WhenAll' dengan satu tugas | Menggunakan WhenAll dengan satu tugas dapat mengakibatkan hilangnya performa. Tunggu atau kembalikan tugas sebagai gantinya. |
| CA1843: Jangan gunakan 'WaitAll' dengan satu tugas | Menggunakan WaitAll dengan satu tugas dapat mengakibatkan hilangnya performa. Tunggu atau kembalikan tugas sebagai gantinya. |
| CA1844: Memberikan penggantian metode asinkron berbasis memori saat membuat subkelas 'Stream' | Untuk meningkatkan performa, ganti metode asinkron berbasis memori saat membuat subkelas 'Stream'. Kemudian implementasikan metode berbasis larik menggunakan metode berbasis memori. |
| CA1845: Gunakan 'string.Concat' berbasis span | Lebih efisien menggunakan AsSpan dan string.Concat, daripada Substring dan operator perangkaian. |
CA1846: Lebih baik gunakan AsSpan daripada Substring |
AsSpan lebih efisien daripada Substring.
Substring melakukan salinan string O(n), sedangkan AsSpan tidak dan memiliki biaya yang konstan.
AsSpan juga tidak melakukan alokasi heap apa pun. |
| CA1847: Gunakan harfiah char untuk pencarian karakter tunggal | Gunakan String.Contains(char), bukan String.Contains(string) saat mencari satu karakter. |
| CA1848: Gunakan delegasi LoggerMessage | Untuk meningkatkan kinerja, gunakan delegasi LoggerMessage. |
| CA1849: Panggil metode asinkron saat dalam metode asinkron | Dalam metode yang sudah asinkron, pemanggilan ke metode lain harus menggunakan versi asinkronnya, jika tersedia. |
CA1850: Lebih baik gunakan metode HashData statik daripada ComputeHash |
Lebih efisien menggunakan metode HashData statik daripada membuat dan mengelola instans HashAlgorithm untuk memanggil ComputeHash. |
CA1851: Kemungkinan beberapa enumerasi dari kumpulan IEnumerable |
Kemungkinan beberapa enumerasi kumpulan IEnumerable. Pertimbangkan untuk menggunakan penerapan yang menghindari beberapa enumerasi. |
| CA1852: Segel tipe internal | Jenis yang tidak dapat diakses di luar rakitannya dan tidak memiliki subjenis dalam assembly yang berisi tidak disegel. |
| CA1853: Panggilan yang tidak perlu ke 'Dictionary.ContainsKey(key)' | Tidak perlu menjaga Dictionary.Remove(key) dengan Dictionary.ContainsKey(key).
Dictionary<TKey,TValue>.Remove(TKey) sudah memeriksa apakah kunci ada dan tidak melemparkan jika tidak ada. |
| CA1854: Lebih baik gunakan metode 'IDictionary.TryGetValue(TKey, out TValue)' | Lebih baik gunakan 'TryGetValue' daripada akses pengindeks Kamus yang dijaga oleh centang 'ContainsKey'. 'ContainsKey' dan pengindeks keduanya mencari kunci, jadi menggunakan 'TryGetValue' menghindari pencarian tambahan. |
| CA1855: Gunakan Span<T>.Clear() alih-alih Span<T>.Fill() | Lebih efisien untuk memanggil Span<T>.Clear() daripada memanggil Span<T>.Fill(T) untuk mengisi elemen rentang dengan nilai default. |
| CA1856: Penggunaan atribut ConstantExpected salah | Atribut ConstantExpectedAttribute tidak diterapkan dengan benar pada parameter. |
| CA1857: Parameter mengharapkan konstanta untuk performa optimal | Argumen yang tidak valid diteruskan ke parameter yang dianotasi dengan ConstantExpectedAttribute. |
| CA1858: Gunakan StartsWith alih-alih IndexOf | Lebih efisien untuk memanggil String.StartsWith daripada memanggil String.IndexOf untuk memeriksa apakah string dimulai dengan awalan tertentu. |
| CA1859: Gunakan jenis beton jika memungkinkan untuk meningkatkan performa | Kode menggunakan jenis antarmuka atau jenis abstrak, yang mengarah ke panggilan antarmuka atau panggilan virtual yang tidak perlu. |
| CA1860: Hindari menggunakan metode ekstensi 'Enumerable.Any()' | Lebih efisien dan lebih jelas untuk menggunakan Length, , Countatau IsEmpty (jika memungkinkan) daripada memanggil Enumerable.Any untuk menentukan apakah jenis koleksi memiliki elemen apa pun. |
| CA1861: Hindari array konstanta sebagai argumen | Array konstan yang diteruskan sebagai argumen tidak digunakan kembali, sehingga menimbulkan overhead kinerja. Pertimbangkan untuk memindahkannya ke field 'static readonly' untuk meningkatkan kinerja. |
| CA1862: Gunakan overload metode 'StringComparison' untuk melakukan perbandingan string tanpa membedakan huruf besar/kecil | Saat kode memanggil ToLower() atau ToUpper() untuk melakukan perbandingan string tanpa membedakan huruf besar/kecil, terjadi alokasi yang tidak diperlukan. |
| CA1863: Gunakan 'CompositeFormat' | Untuk mengurangi biaya pemformatan, simpan dalam cache dan gunakan instans CompositeFormat sebagai argumen untuk String.Format atau StringBuilder.AppendFormat. |
| CA1864: Lebih suka metode 'IDictionary.TryAdd(TKey, TValue)' | Baik Dictionary<TKey,TValue>.ContainsKey(TKey) maupun Dictionary<TKey,TValue>.Add melakukan pencarian, sehingga menjadi redundan. Lebih efisien untuk memanggil Dictionary<TKey,TValue>.TryAdd, yang mengembalikan bool indikasi apakah nilai ditambahkan atau tidak.
TryAdd tidak menimpa nilai kunci jika kunci sudah ada. |
| CA1865-CA1867: Gunakan char overload | Overload char memiliki performa yang lebih baik untuk string yang berisi satu karakter. |
| CA1868: Pemanggilan 'Contains' yang tidak perlu untuk kumpulan | Baik ISet<T>.Add(T) maupun ICollection<T>.Remove(T) melakukan pencarian, sehingga pemanggilan ICollection<T>.Contains(T) sebelumnya menjadi redundan. Lebih efisien untuk memanggil Add(T) atau Remove(T) secara langsung, yang mengembalikan nilai Boolean yang menunjukkan apakah item ditambahkan atau dihapus. |
| CA1869: Simpan dalam cache dan gunakan kembali instans 'JsonSerializerOptions' | Menggunakan instans JsonSerializerOptions lokal untuk serialisasi atau deserialisasi dapat secara substansial menurunkan performa aplikasi Anda jika kode Anda dijalankan beberapa kali, karena System.Text.Json secara internal menyimpan metadata terkait serialisasi ke dalam instans yang disediakan. |
| CA1870: Gunakan instans 'SearchValues' yang di-cache | Menggunakan instans cache SearchValues<T> lebih efisien daripada meneruskan nilai ke 'IndexOfAny' atau 'ContainsAny' secara langsung. |
| CA1871: Jangan berikan struct nullable ke 'ArgumentNullException.ThrowIfNull' | 'ArgumentNullException.ThrowIfNull' menerima parameter 'object', jadi meneruskan struct nullable dapat menyebabkan nilai di-boxing. |
| CA1872: Utamakan 'Convert.ToHexString' dan 'Convert.ToHexStringLower' dibandingkan rangkaian pemanggilan yang berbasis pada 'BitConverter.ToString' | Gunakan Convert.ToHexString atau Convert.ToHexStringLower saat mengodekan byte ke representasi string heksadesimal. Metode ini lebih efisien dan ramah alokasi daripada menggunakan BitConverter.ToString dalam kombinasi dengan String.Replace untuk mengganti tanda hubung dan String.ToLower. |
| CA1873: Hindari pencatatan log yang berpotensi mahal | Ketika metode pengelogan dipanggil, argumennya dievaluasi terlepas dari apakah tingkat pengelogan diaktifkan. Ini dapat mengakibatkan operasi mahal dijalankan bahkan ketika pesan log tidak ditulis. Untuk performa yang lebih baik, jaga panggilan pengelogan mahal dengan cek ke IsEnabled atau gunakan pola.LoggerMessage |
| CA1874: Gunakan 'Regex.IsMatch' |
Regex.IsMatch lebih sederhana dan lebih cepat daripada Regex.Match(...).Success. |
| CA1875: Gunakan 'Regex.Count' |
Regex.Count lebih sederhana dan lebih cepat daripada Regex.Matches(...).Count. |
| CA1877: Gunakan kelebihan beban 'Path.Combine' atau 'Path.Join' | Beberapa operasi Path.Combine atau Path.Join berturut-turut dapat digabungkan menjadi satu panggilan menggunakan overload yang menerima beberapa segmen jalur. |
| CA1878: Lebih suka properti ReadOnlySpan daripada bidang array readonly | Bidang array konstanta readonly statis privat dapat diganti dengan ReadOnlySpan<T> properti sehingga pengompilasi C# dapat menghindari alokasi array terkelola. |
Berkolaborasi dengan kami di GitHub
Sumber untuk konten ini dapat ditemukan di GitHub, yang juga dapat Anda gunakan untuk membuat dan meninjau masalah dan menarik permintaan. Untuk informasi selengkapnya, lihat panduan kontributor kami.