Бөлісу құралы:


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

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

Причина

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

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

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

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

Удалите пустой финализатор. Если для отладки требуется финализатор, заключите весь финализатор в директивы #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
    }