Финализатор — недетерминированная резервная очистка объекта перед освобождением его памяти GC. Соединения с БД нужно закрывать через Dispose/using, а не ждать финализации.
Что такое финализатор и почему не следует освобождать соединения с БД только через него?
Финализатор — недетерминированная резервная очистка объекта перед освобождением его памяти GC. Соединения с БД нужно закрывать через Dispose/using, а не ждать финализации.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Финализатор — недетерминированная резервная очистка объекта перед освобождением его памяти GC. Соединения с БД нужно закрывать через Dispose/using, а не ждать финализации.
Момент сборки мусора не совпадает с окончанием запроса. Ожидание финализатора может надолго удержать соединение, транзакцию или ресурс пула; при завершении процесса финализатор вообще нельзя считать гарантированной очисткой.
Используйте using или await using для поддерживающего IAsyncDisposable провайдера. Dispose часто возвращает соединение в пул, а не обязательно закрывает физическое TCP-соединение. Финализаторы предназначены прежде всего для страховки владения неуправляемыми ресурсами; предпочтительны уже готовые безопасные обёртки вроде SafeHandle.