Bagikan melalui


CA1821: Hapus penyelesai kosong

Properti Nilai
ID Aturan CA1821
Judul Menghapus finalizer kosong
Golongan Performa
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Jenis mengimplementasikan finalizer yang kosong, hanya memanggil finalizer jenis dasar, atau memanggil hanya metode yang dipancarkan secara kondisional.

Deskripsi aturan

Kapan pun Anda bisa, 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 kosong menimbulkan overhead tambahan ini tanpa manfaat apa pun.

Cara memperbaiki pelanggaran

Hapus finalizer kosong. Jika finalizer diperlukan untuk penelusuran kesalahan, sertakan seluruh finalizer dalam #if DEBUG / #endif arahan.

Kapan harus menekan peringatan

Jangan menyembunyikan pesan dari aturan ini.

Contoh

Contoh berikut menunjukkan finalizer kosong yang harus dihapus, finalizer yang harus diapit dalam #if DEBUG / #endif arahan, dan finalizer yang menggunakan #if DEBUG / #endif arahan 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
    }