Из статьи MSDN о реализации Finalize;
Вы должны переопределить Finalize для класса, который использует неуправляемые ресурсы, такие как дескрипторы файлов или подключения к базе данных, которые должны быть освобождены, когда управляемый объект, который их использует, отбрасывается во время сборки мусора.
Из статьи MSDN о реализации IDisposible.Dispose;
Используйте этот метод, чтобы закрыть или освободить неуправляемые ресурсы, такие как файлы, потоки и дескрипторы, удерживаемые экземпляром класса, реализующего этот интерфейс. По соглашению этот метод используется для всех задач, связанных с освобождением ресурсов, удерживаемых объектом, или подготовкой объекта для повторного использования.
Что, даже в контексте каждой (обстоятельной) статьи, кажется довольно двусмысленным определением.
Но вот где я действительно теряю цель Finalize, так это здесь;
Поскольку сборка мусора не является детерминированной, вы не знаете точно, когда сборщик мусора выполняет финализацию. Чтобы освободить ресурсы немедленно, вы также можете реализовать шаблон удаления и интерфейс IDisposable. Реализация IDisposable.Dispose может быть вызвана потребителями вашего класса для освобождения неуправляемых ресурсов, и вы можете использовать метод Finalize для освобождения неуправляемых ресурсов в случае, если метод Dispose не вызывается.
Должен ли я реализовать и то, и другое и принудительно завершить работу в том случае, если приложение-потребитель забудет избавиться от моего объекта?
Мне в новинку так тесно работать с GC ... и я хочу убедиться, что я отбрасываю свои ресурсы должным образом. Однако я не совсем понимаю, почему они существуют и когда их использовать.
IDisposable
включает реализацию финализатора, поэтому я не уверен, как вы должны об этом забыть. - person InBetween   schedule 29.06.2017IDisposable
. Вам понадобится только финализатор для какого-то неуправляемого ресурса, для которого в .NET еще нет оболочки. - person Servy   schedule 29.06.2017