Finalize

Метод Finalize также называется деструктором класса. Его нельзя явно вызвать в коде. Только сборщик мусора может вызывать метод Finalize (финализатор), когда объект становится недоступным. Финализатор не может быть реализован напрямую, только через объявление деструктора. Следующий класс иллюстрирует, как объявить деструктор. Рекомендуется реализовывать методы Finalize и Dispose вместе, если вам нужно реализовать деструктор. После компиляции деструктор становится методом Finalize.

public class MyClass: IDisposable {

//Конструктор

public MyClass() {

//Инициализация

}

//Деструктор или финализатор

~MyClass() {

this.Dispose();

}

public void Dispose() {

//код для освобождения неуправляемых ресурсов

}

}

Использование Finalize

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

Финализация немного дороже в использовании. Она не очищает память сразу. Когда приложение запускается, сборщик мусора поддерживает отдельную очередь на финализацию, куда он добавляет все объекты, которые должны быть финализированы. Другими словами, сборщик мусора знает, для какого объекта реализован метод Finalize. Когда объект становится недоступным и готов к очистке, сборщик мусора вызывает метод Finalize этого объекта и удаляет его из очереди на финализацию. На этой итерации сбора мусора сборщик просто очищает память, которая используется неуправляемым ресурсом. Память, используемая управляемым ресурсом (самим объектом), все еще находится в куче в качестве недоступной ссылки. Эта память освобождается, когда сборщик мусора запустится в следующий раз. Из-за метода финализации сборщик не очищает всю память, связанную с объектом, с первой попытки.



Заключение

Рекомендуется не применять метод Finalize без крайней необходимости. В приоритете всегда должна быть реализация метода Dispose и очистка неуправляемой памяти, как только программа закончит работу с ней.



Источник: https://www.c-sharpcorner.com