Будет ли реализация интерфейса IDisposable перемещать объект в список Finalize?

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

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

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


person Yanshof    schedule 06.02.2012    source источник


Ответы (2)


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

Ссылка: MSDN

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

person Paul Phillips    schedule 06.02.2012
comment
Но является ли Dispose вызовом метода Finalize или просто выполняет «очистку» объекта? - person Yanshof; 07.02.2012
comment
@Yanshof Метод finalize вызывает Dispose, а не наоборот. Невозможно вызвать метод finalize. В этом ответе подробно объясняется шаблон реализации IDisposable. - person Paul Phillips; 07.02.2012

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

person haiyyu    schedule 07.02.2012