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 | CA1821 |
| Judul | Menghapus finalizer kosong |
| 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
Tipe mengimplementasikan finalizer kosong, hanya memanggil finalizer tipe dasar, atau memanggil metode yang hanya diterbitkan secara kondisional.
Deskripsi aturan
Sebisa mungkin, hindari finalizer karena overhead performa tambahan yang terlibat dalam melacak masa pakai objek. Pengumpul sampah menjalankan finalizer sebelum mengumpulkan objek. Ini berarti bahwa setidaknya dua koleksi diperlukan untuk mengumpulkan objek. Finalizer yang kosong menimbulkan overhead tambahan tanpa memberikan manfaat apa pun.
Cara memperbaiki pelanggaran
Hapus finalizer kosong. Jika finalizer diperlukan untuk debugging, sertakan seluruh finalizer dalam direktif #if DEBUG / #endif.
Kapan harus menekan peringatan
Jangan menyembunyikan pesan dari aturan ini.
Contoh
Contoh berikut menunjukkan finalizer kosong yang harus dihapus, finalizer yang harus dilingkupi dalam direktif #if DEBUG / #endif, dan finalizer yang menggunakan direktif #if DEBUG / #endif dengan benar.
public class Class1
{
// Violation occurs because the finalizer is empty.
~Class1()
{
}
}
public class Class2
{
// Violation occurs because Debug.Fail is a conditional method.
// The finalizer will contain code only if the DEBUG directive
// symbol is present at compile time. When the DEBUG
// directive is not present, the finalizer will still exist, but
// it will be empty.
~Class2()
{
Debug.Fail("Finalizer called!");
}
}
public class Class3
{
#if DEBUG
// Violation will not occur because the finalizer will exist and
// contain code when the DEBUG directive is present. When the
// DEBUG directive is not present, the finalizer will not exist,
// and therefore not be empty.
~Class3()
{
Debug.Fail("Finalizer called!");
}
#endif
}