IDisposable, Garbage Collector, Finalizer.

Знаю, что сборщик мусора срабатывает автоматически, и он очищает объекты без ссылок из кучи. Вроде бы точно так же действует и метод Dispose, и финализатор (он же - деструктор) (поправьте если что не так).

Так в чём же разница между ними и зачем нужны деструкторы и интерфейс IDisposable если есть Garbage Collector?

Верно сказал, что сборщик мусора вызывается автоматически, а Dispose (за исключением конструкции using, где за пределами блока метод Dispose вызывается также автоматически) нужно вызывать вручную. Деструктор же также вызывается неявно, перед тем как объект будет удалён.

Весь процесс происходит примерно так:

1) Garbage Collector находит неиспользуемые объекты (те, которые не привязаны ни к чему). Объекты без деструкторов в данном случае удаляются сразу.

2) Объекты с деструкторами сохраняются в активном состоянии и помещаются в очередь.

3) Далее программа продолжает выполнение и параллельно с тем начинает выполняться потом финализации, выдёргивая объекты из той очереди и запуская их личные методы финализации.

4) После этого, когда объект извлечен из очереди, а его деструктор сработал, объект становится недоступным и будет удалён при следующей сборке мусора.

Помимо так называемой “управляемой памяти” (всё, что было перечислено выше) существуют также другие ресурсы, которые может использовать программа. Например это может быть файл, сетевое подключение и т.д.. Вот эти “неуправляемые” ресурсы сборщиком мусора не освобождаются и типы, которые выполняют инкапсуляцию работы с этими ресурсами должны освобождать их после завершения самостоятельно. Для этого используется интерфейс IDisposable с его методом Dispose. В данном случае освобождение вызывается явно, одновременно с тем как сборка мусора полностью автоматизирована и не требует стороннего вмешательства со стороны программиста.

На курсе C# Professional вы можете подробно узнать информацию касательно данной темы.