CA1821: Hapus finalizer kosong

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
    }