Будет ли реализация интерфейса IDisposable перемещать объект в список «Завершить»? - PullRequest
1 голос
/ 07 февраля 2012

Я сейчас читаю о методе Dispose и Finalize в CLR (4.0) Я что-то не понимаю ...

Если я добавлю реализацию Finalize (~ className1) в мой код =>, то в списке Finalize будет указатель на экземпляр объекта, который находится в управляемой куче.

Теперь позвольте мне сказать, что я не реализовал Finalize (~ className2), и я просто реализовал интерфейс IDisposable в своем коде. Будет ли у этого объекта указатель из списка Finalize?

Ответы [ 2 ]

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

Нет. Если у объекта нет финализатора, он не будет в очереди финализации.

Ссылка: MSDN

Сборщик мусора отслеживает объекты, которые имеют методы Finalize ... Каждый раз, когда ваше приложение создает объект, имеющий метод Finalize, сборщик мусора помещает запись в очередь завершения, которая указывает на этот объект.

0 голосов
/ 07 февраля 2012

В принципе, чем дольше существует объект, тем меньше сборщик мусора будет проверять, есть ли на него ссылки в коде. Это означает, что неиспользуемые объекты часто могут оставаться в памяти, хотя на них уже давно не ссылаются. Также, если вы хотите явно указать объекту очистить его ресурсы, используйте метод Dispose. Я бы предложил вызвать GC.SuppressFinalize (this) в его реализации, а также вызвать метод Dispose в финализаторе. Таким образом, если пользователь забудет вызвать Dispose, что не должно, но может произойти, ресурсы объекта со временем будут освобождены.

...