Сборка мусора : GC восстанавливает память, используемую объектом, когда на объект не ссылаются больше.
Dispose : метод из интерфейса IDisposable, который являетсяосвободить все управляемые и неуправляемые ресурсы, когда программист вызывает их (прямо или косвенно через блок using).
Finalizer : метод для освобождения всех неуправляемых ресурсов.Вызывается GC перед освобождением памяти.
Управляемый ресурс : любой класс .NET, который реализует интерфейс IDisposable
, например Streams и DbConnections.
Неуправляемый ресурс : начинка в классах управляемых ресурсов.Дескрипторы Windows являются наиболее тривиальными примерами.
Теперь, чтобы ответить на ваш вопрос:
GC хранит список (очередь завершения) всех объектов, класс которых объявляет финализатор (~ ClassNameв C #).Объекты помещаются в эту очередь при создании.GC периодически запускается, чтобы проверить, есть ли какие-либо объекты, недоступные из программы.Затем он проверяет, имеются ли ссылки на какие-либо недоступные объекты из очереди финализации, и помещает их в другую очередь, называемую свободная очередь, в то время как остальные освобождаются.Отдельный поток используется для запуска методов Finalize объектов в очереди Freacheable.
В следующий раз, когда GC запустится, он обнаружит, что некоторые объекты, ранее находившиеся в очереди на освобождение, уже были завершены, поэтому готовы к восстановлению.Обратите внимание, что GC нужно как минимум два цикла (или намного больше, если нужно выполнить финализацию), чтобы избавиться от объекта с помощью финализатора, что влечет за собой некоторые потери производительности.
Метод SuppressFinalize
просто устанавливает флаг в заголовке объекта, который указывает, что финализатор не нужно запускать.Таким образом, GC может сразу же восстановить память объекта.Согласно приведенному выше определению, метод Dispose
делает то же самое, что и финализатор (и более), поэтому, если он выполняется, финализация больше не является необходимой.Используя метод SuppressFinalize
, вы можете сохранить некоторую работу для GC, уведомив об этом.Кроме того, теперь вам не нужно реализовывать проверки в финализаторе, чтобы избежать двойного освобождения.Единственная проблема с Dispose
заключается в том, что он не гарантированно выполняется, потому что программист несет ответственность за его вызов, поэтому иногда нам нужно беспокоиться о Finalizer.
Это, как говорится,только очень и очень редко вам нужно написать Finalizer, потому что для подавляющего большинства обычных неуправляемых ресурсов управляемая оболочка уже существует, и управляемые ресурсы должны быть освобождены путем вызова их методов Dispose
из ваших собственных Dispose
метод, и только оттуда!В финализаторах вы никогда не должны вызывать метод Dispose.
Дальнейшее чтение :