Вопрос

GC предназначен для управляемых объектов, а Finalize — для неуправляемых объектов, это то, что я читал.Dispose является неявным, а Finalize является явным - это то, что я читал.Может ли кто-нибудь привести мне пример одного модуля, в котором все три вещи использовались по разным причинам?

Это было полезно?

Решение

GC — это сбор мусора.Это автоматическое управление памятью, которое обеспечивает очистку объектов, размещенных в управляемой куче..NET GC использует алгоритм пометки и очистки.Когда происходит сборка мусора, она в основном считает, что все объекты в той части кучи, которую нужно очистить, можно восстановить.Затем он проходит процесс маркировки, в ходе которого сканируется на наличие корней.Т.е.он идентифицирует объекты, которые все еще используются приложением.После этого оставшиеся объекты подлежат очистке.Куча может быть уплотнена в ходе очистки.

Методы Dispose и Finalizer предлагают возможность очистки ресурсов, т.е. нет обрабатывается GC.Например.это могут быть родные ручки и тому подобное.Они не имеют ничего общего с освобождением памяти в управляемой куче.

Dispose должен вызываться явно для типа, который реализует IDisposable.Его можно вызвать либо через Dispose() сам метод или через using построить.ГХ не будет автоматически вызывать Dispose.

С другой стороны, финализатор или деструктор (как его называет спецификация языка) будет автоматически вызываться. когда-то после того, как объект был допущен к очистке.Методы Finalize выполняются последовательно в выделенном потоке.

Dispose() позволяет детерминированную очистку ресурсов, в то время как финализатор может действовать как подстраховка на случай, если пользователь не позвонит Dispose().

Если тип реализует финализатор, очистка экземпляров задерживается, поскольку финализатор должен быть вызван до очистки.Т.е.потребуется дополнительная сборка для освобождения памяти для экземпляров этого типа.Если тип также реализует IDisposable, можно вызвать метод Dispose, а затем экземпляр может удалить себя из финализации.Это позволит очистить объект, как если бы у него не было финализатора.

Если вы хотите покопаться в этом, я рекомендую CLR через C# Джеффри Рихтера.Это замечательная книга, и она охватывает все кровавые подробности (некоторые детали я упустил).Только что вышло новое третье издание.

Другие советы

Одним из преимуществ .NET является сборщик мусора.Во многих языках разработчик должен управлять каждым фрагментом памяти — любая выделенная память в конечном итоге должна быть освобождена.В .NET (C#) сборщик мусора (GC) позаботится о процессе освобождения памяти за вас.Он отслеживает использование ваших объектов и после того, как они становятся «отключенными» (т.е.:в вашем приложении нет прямых или косвенных ссылок на этот объект), память объекта автоматически очищается.

Утилизировать, а точнее, IDisposable и шаблон Dispose используется для обработки ресурсов отдельно от GC.Некоторые ресурсы должны быть явно очищено, по разным причинам.Это включает в себя использование «родного» API (где .NET не знает о выделенной памяти), использование ресурса, который обертывает собственные дескрипторы, и т. д.Чтобы справиться с этим чисто, вы реализуете IDisposable и шаблон Dispose.

Финализация происходит на объектах, когда они собираются быть собраны сборщиком мусора.Это обеспечивает «сеть безопасности», при которой объект, который должен был быть удален, все равно может быть очищен, хотя и немного позже идеального.Реализуя финализатор, вы можете гарантировать, что неуправляемые ресурсы всегда будут освобождены.

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

Возможно, вы просто захотите прочитать то, что я считаю исчерпывающей статьей об IDisposable, финализаторах и сборке мусора, Шон Фаркас. CLR наизнанку:Копаем в IDisposable.

Эта статья не оставляет никаких сомнений по этому поводу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top