Любой объект, который непосредственно использует неуправляемый ресурс, такой как дескриптор файла или соединение с базой данных, должен всегда реализовывать finalizer, который освобождает неуправляемый ресурс. Когда объект собирает мусор, завершается финализатор, и неуправляемый ресурс освобождается. Поэтому, чтобы ответить на ваш вопрос:
Когда этот объект выходит из сферы действия и в конечном итоге собирает мусор, эти два ресурса затем освобождаются или остаются в памяти?
Да, неуправляемые ресурсы, в конечном счете, будут освобождены от сборщика мусора, который вызывает финализации объекта.
Как вы знаете, оставляя его сборщику мусора для очистки неуправляемых ресурсов, как правило, плохо. Если вы откроете и прочитаете файл, вы предпочтете, чтобы файл был закрыт и доступен другим процессам, когда чтение завершилось вместо этого в какое-то случайное время, когда сборщик мусора решает освободить теперь неиспользуемый файл-объект.
.NET предоставляет интерфейс IDisposable
, позволяющий детерминированный выпуск неуправляемых ресурсов.Когда вы удаляете объект FileStream
, основной неуправляемый дескриптор файла освобождается, и файл закрывается.
Важной частью реализации интерфейса IDisposable
является то, что если неуправляемый ресурс освобождается по вызову Dispose
, то объект больше не нуждается в доработке. Вот почему вы видите вызов GC.SuppressFinalize(this)
, когда объект реализует IDisposable
и имеет финализатор. Избегание финализации - это хорошая вещь, чтобы уменьшить количество ресурсов, которые должен использовать сборщик мусора. Кроме того, финализаторы работают в жестких ограничениях, установленных сборщиком мусора, поэтому их лучше избегать.
Обратите внимание, что в большинстве случаев ваши объекты не будут иметь финализатор, потому что вы не используете неуправляемый ресурс. Вместо этого вы получите доступ к неуправляемым ресурсам с помощью управляемых объектов, таких как SafeHandle
. В этом случае объект не нуждается в финализаторе, но должен реализовать IDisposable
и переадресовывать вызовы на Dispose
на любые агрегированные объекты IDisposable
.
Обратите внимание, что 'private File file;' составлен код, System.IO.File является статическим. –
Yikes, еще рано здесь! Код образца был отредактирован. –
Новый код имеет новые проблемы, но неважно. –