Объект с финализатором проходит две фазы GC: первый раз запускается финализатор и второй раз, объект фактически собирается и память освобождается. Помимо повышения давления ГХ и задержки возврата памяти обратно в пул, финализаторы также имеют функцию работы с объектами, поля которых могут быть не в допустимом состоянии. Кроме того, создание исключения в потоке финализатора мгновенно разрушает все приложение без какой-либо дружественной информации о том, что только что произошло.
Именно поэтому реализация шаблона Dispose всегда содержит вызов GC.SuppressFinalize
, который заставляет финализатор не запускаться в случае, если объект уже был удален, и GC может непосредственно освободить память при первом запуске.
Как правило, использование финализаторов может быть очень сложным и сложным, если ваше приложение должно выдерживать критические исключения, такие как нехватка памяти или прерывание потока и последующие выгрузки AppDomain - это касается таких приложений, как SQL Server или IIS.
Короче говоря: не используйте финализаторы без крайней необходимости, и если вам нужно (например, используя неуправляемые ресурсы), вас ждет довольно много исследований.
Вы можете найти больше чтения по этой теме в следующих сообщениях в блоге:
Эрик Липперт - Когда все, что вы знаете, неверно
Джо Даффи - Никогда больше не пиши финализатор