Вызов SuppressFinalize существует в случае, если какой-то производный класс решит добавить финализатор. Если нормальное удаление завершается успешно, завершение не требуется; даже если производный класс решит добавить его, вызов SuppressFinalize предотвратит его выполнение и вмешательство в сборку мусора.
Чтобы понять, почему это важно, вы должны думать о финализации не как о части сборки мусора, а о том, что происходит перед ней. Когда класс регистрируется для завершения (автоматически при создании, если он переопределяет Finalize), он помещается в специальный список, называемый Очередь завершения. Ни один объект в очереди завершения, ни какой-либо объект, на который прямо или косвенно ссылается объект в очереди, не могут быть удалены мусором , но если обнаруживается, что какой-либо объект в очереди завершения не имеет корневых ссылок кроме очереди , объект будет извлечен из очереди и запустится финализатор. Во время отправки финализатора объект не будет доступен для сбора (поскольку во время отправки будет существовать ссылка); после завершения работы финализатора ссылки на объект, как правило, больше не будут, поэтому он (и объекты, на которые он ссылается) обычно будет собираемым.
Лично я считаю SuppressFinalize глупым, поскольку я не могу придумать ни одной веской причины, по которой производный класс должен иметь финализатор. Если производный класс собирается добавить свои неуправляемые ресурсы (*), о которых родительский класс ничего не будет знать, следует создать другой класс для хранения этих ресурсов; родительский класс должен содержать ссылку на это. Таким образом, сам родительский класс не будет нуждаться в финализации, и объекты, на которые ссылается родительский класс, не будут излишне заблокированы от сборки мусора.