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


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

Свойство Значение
Идентификатор правила CA1821
Заголовок Удалите пустые методы завершения
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

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

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

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

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

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

Когда лучше отключить предупреждения

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

Пример

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

    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
    }