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
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Öneri olarak
Geçerli diller C# ve Visual Basic

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 çağrılan yöntemleri çağırır.

Kural açıklaması

Nesne ömrünü izlemeyle ilgili performans ek yükü nedeniyle, mümkün olduğunca sonlandırıcıları kullanmaktan kaçının. Çö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ı, herhangi bir fayda sağlamaksızın ek bir yük oluşturur.

İhlalleri düzeltme

Boş sonlandırıcıyı kaldırın. Hata ayıklama için bir sonlandırıcı gerekiyorsa, sonlandırıcının tamamını #if DEBUG / #endif talimatları içine alın.

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

Bu kuraldan gelen bir mesajı bastırmayın.

Ö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
    }