Имеет ли эффект 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()
. Но это всего лишь МХО.)