Вызов метода Dispose очистит и сжимает память в .Net? - PullRequest
3 голосов
/ 09 февраля 2012

Я имею представление о методе Dispose и Finalize в .Net следующим образом. Пожалуйста, поправьте меня, если я ошибаюсь.

Утилизация: Внедрите интерфейс IDisposable и удалите неиспользуемый / неуправляемый код в методе Dispose. Разработчик должен вызвать его вручную, если он хочет немедленного удаления, или GC будет распоряжаться ресурсами при его вызове.

Finalize: при вызове GC он освобождает неиспользуемый управляемый код, а если реализован IDisposable, то он вызывает метод Dispose для освобождения неуправляемых ресурсов (обычно).

Вопрос заключается в следующем: когда мы удаляем ресурсы с помощью метода Dispose, память немедленно освобождается и сжимается (как это делает GC)?

Ответы [ 3 ]

5 голосов
/ 09 февраля 2012

Ответ на ваш вопрос - нет: освобождение памяти, выделенной для объекта, не имеет ничего общего с вызовом метода Dispose.Это происходит со временем, когда сборщик мусора попадает в него.

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

Финализатор, однако, отличается: он вызывается как часть сборки мусора и предназначен длявысвобождение внешних ресурсов, которые не были освобождены во время утилизации (предположительно, потому что пользователь забыл вызвать Dispose).Финализаторы не должны вызывать Dispose других объектов, которые может содержать ваш объект, поскольку они уже находятся в процессе сбора мусора.

2 голосов
/ 09 февраля 2012

Нет. Вызов метода Dispose напрямую или с помощью оператора using не приведет к освобождению памяти.

Внедрение IDisposable просто даст вашему классу возможность очистить любые неуправляемые ресурсы, на которых он держится.

1 голос
/ 09 февраля 2012

Finalize: при вызове GC он освобождает неиспользованный управляемый код, а если реализован IDisposable, то он вызывает метод Dispose для освобождения неуправляемых ресурсов (обычно).

Вы здесь несколько не правы. Когда вы говорите «он будет вызывать Dispose», если вы ссылаетесь на сам GC, то нет, он «автоматически» не вызывает Dispose для вас. Ваша задача как программиста - выполнять очистку в методах Dispose и Finalizer.

Эта запись MSDN здесь демонстрирует типичный шаблон удаления.

Вопрос в следующем: когда мы удаляем ресурсы с помощью метода Dispose, память немедленно освобождается и уплотняется (как это делает GC)?

Нет, вызов Dispose не освобождает кучу памяти. Память кучи не освобождается, пока GC не запустится и не выполнит очистку.

...