В языках программирования у объекта может быть только переменная в течение его существования, после создания экземпляра он не может быть изменен. Таким образом, одна и та же ячейка памяти не может быть выделена для новых значений, поэтому для управления неиспользуемыми пространствами требуется какое-то автоматическое управление памятью. Эти неиспользуемые пространства называются мусором, а весь процесс эффективного управления памятью называется сборкой мусора..
Основной целью сборщика мусора является отделение мертвых объектов от живых объектов и освобождение места для повторного использования. По сути, все это работает с управляемой кучей, которая является не чем иным, как блоком памяти, и сборщик мусора периодически проверяет память кучи для выделения памяти новым объектам. Существует два метода освобождения неуправляемых ресурсов, таких как файлы и соединения с базой данных: удаление и завершение.
Эта статья поможет вам понять разницу между двумя.
Dispose - это стандартный способ для пользователей указывать объектам высвобождать свои ресурсы и не пытаться снова получить доступ к объектам. Метод dispose обеспечивает управление явной очисткой памяти, делая объекты непригодными для использования..
Когда пользователи вызывают метод Dispose (), предполагается, что объект освобождает все свои дорогостоящие ресурсы, делая его доступным для повторного использования. Он никогда не вызывается сборщиком мусора, который включается только тогда, когда управляемой памяти становится мало. Специальный интерфейс под названием «IDisposable» используется, чтобы решить, где и как реализовать Dispose (). Но что происходит, когда метод dispose не вызывается?
Если метод dispose не вызывается, запасной вариант заключается в использовании метода Finalize () для очистки. Он вызывается сборщиком мусора для выполнения окончательной очистки ресурса перед освобождением памяти. Концепция своевременной очистки становится здесь неприменимой, потому что вместо немедленного выделения памяти объект добавляется в очередь финализации только для последующего уничтожения. Finalize больше похожа на защитную меру, применяемую в случае программной ошибки, и утилизация не очищает ресурсы, и в этом случае сборщик мусора вызывает метод Finalize () для удаления недоступных объектов в любой последовательности, которая ему нравится..
Метод Dispose вызывается для ускорения высвобождения неуправляемых ресурсов, таких как дескрипторы базы данных, файловые дескрипторы, семафоры и другие объекты, выделенные операционной системой. Метод dispose вызывается для выполнения кода, необходимого для очистки неиспользуемой памяти и дефицитных ресурсов, таких как дескрипторы GDI. Проще говоря, метод dispose обеспечивает управление явной очисткой памяти. Метод finalize, с другой стороны, является частью сборки мусора, используемой для выполнения окончательной очистки объекта перед его сборкой мусора. Проще говоря, метод finalize вызывается для освобождения неуправляемых ресурсов, удерживаемых объектом до его уничтожения..
Метод Dispose может быть вызван явно кодом пользователя и классом, реализующим метод для удаления ресурсов. Однако память не может быть освобождена, пока сборщик мусора не выполнит процесс очистки. Метод может быть вызван, даже если другие ссылки на объект все еще существуют. Метод finalize, напротив, может быть вызван сборщиком мусора только после того, как он определит, что последний экземпляр объекта памяти уничтожен и больше нет ссылок на объект. После выполнения метода finalize объект удаляется из памяти кучи.
Процесс удаления объекта из памяти называется шаблоном утилизации, который можно использовать для объектов, которые обращаются к неуправляемым ресурсам, поскольку сборщик мусора не может вернуть неуправляемые ресурсы. Интерфейс «IDisposable» вместе с дополнительным методом Dispose (Boolean) реализован с целью освобождения неуправляемых ресурсов. Метод finalize выполняется, когда экземпляр объекта уничтожается до его освобождения. Это недетерминированный метод, который происходит по усмотрению сборщика мусора и может даже не произойти. Это не должно быть реализовано на управляемых объектах, пока не будет крайне необходимо.
Гораздо быстрее использовать метод dispose, а не finalize для мгновенного удаления объектов. Деструкторы автоматически преобразуются в метод финализации во время выполнения. Он автоматически вызывается сборщиком мусора, когда объект выходит из области видимости, что обычно происходит, когда экземпляр этого объекта уничтожается. Проблема с методом finalize заключается в том, что он недетерминирован, то есть он не уверен, когда вернуть память, на которую больше нет ссылок через сборщик мусора. Тем не менее, это может не сразу освободить память; на самом деле, он никогда не может быть вызван и не может быть принудительно вызван.
Основное различие между методами dispose и finalize заключается в том, что первый является детерминированным методом, который мгновенно удаляет объекты, когда они больше не используются, в то время как последний является недетерминированным методом для распределения неуправляемых ресурсов, то есть это метод обратного останова для освобождения экземпляры объекта памяти, когда они выходят из области видимости до своего освобождения. Всегда желательно использовать метод dispose над finalize, если в этом нет особой необходимости.
Другими словами, finalize - это защита, применяемая для очистки неуправляемых ресурсов, когда метод dispose не может быть вызван в случае какой-либо ошибки программирования. Метод Finalize вызывается сборщиком мусора, когда объект собирается выгнать из памяти кучи.