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

Зачем GC.SuppressFinalize в Dispose

Вопрос

Зачем в Dispose() вызывают GC.SuppressFinalize(this)?

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

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

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

Коротко

Правильный ответ: Чтобы убрать объект из очереди финализации: ресурсы уже свободны. Если ресурсы освобождены явно, финализатор становится лишним.

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

  1. Чтобы немедленно освободить память объекта, не дожидаясь GC
  2. Чтобы убрать объект из очереди финализации: ресурсы уже свободныправильный ответ
  3. Чтобы запретить повторный вызов Dispose у того же объекта
  4. Чтобы GC не собрал объект, пока он ещё используется в методе

Разбор

Если ресурсы освобождены явно, финализатор становится лишним. SuppressFinalize снимает регистрацию, и объект соберётся за одну сборку, без очереди финализации. Память сразу не освобождается, это делает GC позже. От повторного Dispose защищает флаг _disposed. Чтобы объект не собрали раньше времени, используют GC.KeepAlive.

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

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