Выбор ответа Middle GC, IDisposable и производительность обновлено

Финализатор и сборка мусора

Вопрос

Чем плох финализатор (~MyClass()) у класса без неуправляемых ресурсов?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Объект переживает лишнюю сборку: сначала он идёт в очередь финализации. Объект с финализатором при создании регистрируется в списке финализации.

Варианты ответа

  1. Объект переживает лишнюю сборку: сначала он идёт в очередь финализацииправильный ответ
  2. Финализатор вызывается сразу при выходе объекта из области видимости
  3. Финализатор запрещает вызывать Dispose у объекта этого класса
  4. Финализатор вызывается в UI-потоке и блокирует интерфейс приложения

Разбор

Объект с финализатором при создании регистрируется в списке финализации. Когда он становится недостижимым, GC не освобождает его, а ставит в очередь, поток финализации вызывает ~MyClass(), и только следующая сборка забирает память. Объект и всё, на что он ссылается, продвигаются в старшее поколение. Время вызова не детерминировано, поток отдельный. Финализатор нужен лишь как страховка для неуправляемых ресурсов, лучше через SafeHandle.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.