Aturan performa

Aturan performa mendukung pustaka dan aplikasi berkinerja tinggi.

Di bagian ini

Aturan Deskripsi
CA1802: Gunakan Harfiah Jika Sesuai Bidang dinyatakan statis dan baca-saja (Bersama dan ReadOnly di 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 dalam Visual Basic) sehingga nilai dihitung pada waktu kompilasi, bukan saat durasi.
CA1805: Jangan inisialisasi yang tidak perlu Runtime .NET menginisialisasi semua bidang jenis referensi ke nilai defaultnya sebelum menjalankan konstruktor. Dalam kebanyakan kasus, secara eksplisit menginisialisasi bidang ke nilai default adalah berlebihan, yang menambah biaya pemeliharaan dan dapat menurunkan performa (seperti dengan ukuran rakitan yang ditingkatkan).
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 bidang statik jenis referensi sebaris 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: Menghindari kelas internal yang tidak dibuat instansnya 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: Lebih baik gunakan array berjajar daripada 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, penerapan Sama Dengan yang diwarisikan menggunakan pustaka Refleksi dan membandingkan konten semua bidang. Refleksi memerlukan biaya komputasi yang mahal, dan membandingkan setiap bidang untuk kesetaraan mungkin tidak perlu. Jika Anda mengharapkan pengguna untuk membandingkan atau mengurutkan instans, atau menggunakan instans sebagai kunci tabel hash, jenis nilai Anda harus menerapkan Sama Dengan.
CA1819: Properti tidak boleh mengembalikan larik Larik yang dikembalikan oleh properti tidak dilindungi penulisan, meskipun properti bersifat baca-saja. Untuk menjaga agar larik tidak rusak, properti harus mengembalikan salinan larik. Biasanya, pengguna tidak akan memahami implikasi performa yang merugikan dari panggilan properti semacam itu.
CA1820: Uji string kosong menggunakan panjang string Membandingkan string dengan menggunakan properti String.Length atau metode String.IsNullOrEmpty secara signifikan lebih cepat daripada menggunakan Sama Dengan.
CA1821: Hapus penyelesai kosong Jika perlu, hindari penyelesai karena biaya performa tambahan yang terlibat dalam melacak masa pakai objek. 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 statik, kompilator akan memancarkan situs panggilan nonvirtual 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 menginformasikan Resource Manager bahasa yang digunakan untuk menampilkan sumber daya budaya netral untuk rakitan. Ini meningkatkan performa pencarian untuk sumber daya pertama yang Anda muat dan dapat mengurangi rangkaian pekerjaan Anda.
CA1825: Hindari alokasi larik zero-length Menginisialisasi larik zero-length 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 metode Tambahkan dan Sisipkan yang diketik dengan kuat di StringBuilder Append dan Insert menyediakan kelebihan beban untuk beberapa jenis di luar System.String. Jika memungkinkan, pilih overload yang diketik dengan kuat daripada 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 Pengaturan StringBuilder selalu membuat sebuah salinan buffer asli, menghasilkan beberapa alokasi 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: Kamus Pilihan Berisi metode 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 terapkan metode berbasis larik dalam hal metode berbasis memori.
CA1845: Gunakan 'string.Concat' berbasis rentang 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 tumpukan 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 performa, gunakan delegasi LoggerMessage.
CA1849: Panggil metode asinkron saat dalam metode asinkron Dalam metode yang sudah asinkron, panggilan ke metode lain harus ke versi asinkron metode, jika ada.
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 jenis 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 Rentang<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 konstanta yang diteruskan sebagai argumen tidak digunakan kembali yang menyiratkan overhead performa. Pertimbangkan untuk mengekstraknya ke bidang 'readonly statis' untuk meningkatkan performa.
CA1862: Gunakan metode 'Perbandingan String' kelebihan beban untuk melakukan perbandingan string yang tidak peka huruf besar/kecil Saat kode memanggil ToLower() atau ToUpper() untuk melakukan perbandingan string yang tidak peka huruf besar/kecil, alokasi yang tidak perlu dilakukan.
CA1863: Gunakan 'CompositeFormat' Untuk mengurangi biaya pemformatan, cache dan gunakan CompositeFormat instans sebagai argumen ke String.Format atau StringBuilder.AppendFormat.
CA1864: Lebih suka metode 'IDictionary.TryAdd(TKey, TValue)' Baik Dictionary<TKey,TValue>.ContainsKey(TKey) dan Dictionary<TKey,TValue>.Add lakukan pencarian, yang berlebihan. 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 Kelebihan karakter adalah kelebihan beban berkinerja lebih baik untuk string dengan satu karakter.
CA1868: Panggilan yang tidak perlu ke 'Berisi' untuk set Baik ISet<T>.Add(T) dan ICollection<T>.Remove(T) lakukan pencarian, yang membuatnya berlebihan untuk memanggil ICollection<T>.Contains(T) sebelumnya. Lebih efisien untuk memanggil Add(T) atau Remove(T) secara langsung, yang mengembalikan nilai Boolean yang menunjukkan apakah item ditambahkan atau dihapus.
CA1869: 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 'objek', jadi meneruskan struct nullable dapat menyebabkan nilai dikotak.
CA1872: Lebih suka 'Convert.ToHexString' dan 'Convert.ToHexStringLower' daripada rantai panggilan berdasarkan '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.