Имеет ли эффект GC.SuppressFinalize(), если у объекта нет Finalizer?

Я знаю, что с какой-то версии StreamWriterпрекратил поддержку Finalizer, но в исходном коде я вижу, что он вызывает GC.SuppressFinalize(this). Почему так звонит? Я думал, что это на самом деле только для объекта, у которого есть Finalizer.


Обновлять

мне интересно, GC.SuppressFinalize()имеет какой-то эффект, если объект не имеет Finalizer?

1 ответ

Это часть шаблона удаления .

Microsoft описывает шаблон удаления следующим образом:

      public void Dispose()
{
   // Dispose of unmanaged resources.
   Dispose(true);
   // Suppress finalization.
   GC.SuppressFinalize(this);
}

Чтобы процитировать ссылку:

The Disposeметод выполняет очистку всего объекта, поэтому сборщику мусора больше не нужно вызывать объекты. Object.Finalizeпереопределить. Поэтому вызов в SuppressFinalizeпредотвращает запуск финализатора сборщиком мусора. Если тип не имеет финализатора, вызов GC.SuppressFinalizeне имеет никакого эффекта. Обратите внимание, что фактическая очистка выполняется Dispose(bool)перегрузка метода.

редактировать: Если смотреть дальше, что касается DRY, я бы просто позвонил StreamWrite.Dispose(). Более того, StreamWriter.Close()в любом случае кажется избыточным, поскольку базовый класс TextWriter.Close()имеет такое же содержание! (И что нужно напрямую позвонить TextWrite.Dispose(). Но это всего лишь МХО.)

Другие вопросы по тегам