Aracılığıyla paylaş


CA1821: Boş sonlandırıcıları kaldırın

Özellik Değer
Kural Kimliği CA1821
Başlık Boş sonlandırıcıları kaldırın
Kategori Performans
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 9'da varsayılan olarak etkin Öneri olarak

Neden

Bir tür boş bir sonlandırıcı uygular, yalnızca temel tür sonlandırıcısını çağırır veya yalnızca koşullu olarak yayılan yöntemleri çağırır.

Kural açıklaması

Mümkün olduğunca, nesne ömrünü izlemeyle ilgili ek performans ek yükü nedeniyle sonlandırıcıları önleyin. Çöp toplayıcı, nesneyi toplamadan önce sonlandırıcıyı çalıştırır. Bu, nesneyi toplamak için en az iki koleksiyon gerektiği anlamına gelir. Boş bir sonlandırıcı, bu ek yükü herhangi bir avantaj olmadan doğurabilir.

İhlalleri düzeltme

Boş sonlandırıcıyı kaldırın. Hata ayıklama için sonlandırıcı gerekiyorsa, sonlandırıcının tamamını yönergelere dahil #if DEBUG / #endif edin.

Uyarıların ne zaman bastırılması gerekiyor?

Bu kuraldan bir iletiyi gizlemeyin.

Örnek

Aşağıdaki örnekte kaldırılması gereken boş bir sonlandırıcı, yönergeler içine #if DEBUG / #endif alınması gereken bir sonlandırıcı ve yönergeleri doğru kullanan #if DEBUG / #endif bir sonlandırıcı gösterilmektedir.

    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
    }