Поделиться через


CA1821: удаляйте пустые методы завершения

TypeName

RemoveEmptyFinalizers

CheckId

CA1821

Категория

Microsoft.Performance

Критическое изменение

Не критическое

Причина

Тип реализует пустой финализатор, вызывает только финализатор базового типа или вызывает только условно создаваемые методы.

Описание правила

Если возможно, старайтесь не использовать финализаторы, поскольку из-за отслеживания жизненного срока объектов снижается производительность программы.Сборщик мусора запустит финализатор перед сбором объекта.Это означает, что для сбора объекта требуются две коллекции.Таким образом, наличие пустого финализатора приводит к значительному снижению производительности и к расходу вычислительных ресурсов впустую.

Устранение нарушений

Удалите пустой финализатор.Если финализатор нужен для отладки, заключите весь финализатор в директивы #if DEBUG / #endif.

Отключение предупреждений

Не следует отключать вывод предупреждений для этого правила.Неотключенные финализаторы снижают производительность программы и не дают преимуществ.

Пример

В следующем примере показан пустой финализатор, который нужно удалить; финализатор, который нужно заключить в директивы #if DEBUG / #endif и финализатор, правильно использующий директивы #if DEBUG / #endif.

using System.Diagnostics;

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
}