"если избавиться ..." никогда не выполнится
освободить управляемый
ресурсы - в результате чего они остаются
в памяти до следующего прохода GC. Зачем
Разве они не будут явно освобождены?
«Если утилизация» не будет выполняться, но управляемые ресурсы будут освобождены на этом этапе GC (если они действительно имеют право на освобождение). К тому времени, когда ваш объект завершается, он не может быть достигнут никакими другими живыми объектами, поэтому любые дочерние объекты не будут иметь права на сбор, поскольку ваш объект все еще ссылается на них.
Почему IDE не генерирует вызов Dispose (false) при переопределении
Finalize () для класса IDisposable?
Они, вероятно, просто не добавили специальный случай для проверки на Dispose при создании заглушки переопределения для Finalizer. Кроме того, IDE не генерирует финализатор автоматически, поскольку большинству классов не нужен финализатор. Единственный раз, когда у вас должен быть финализатор, это если вы непосредственно владеете неуправляемым ресурсом. Путь Dispose (false) может все еще вызываться производным классом, который владеет неуправляемым ресурсом и, следовательно, нуждается в финализаторе. Возможность производного финализатора также является причиной того, что вызов метода GC.SuprressFinalize всегда должен присутствовать в базовом методе Dispose ().
Как GC узнает, чтобы вызвать Dispose (false) и убедиться, что это
реализация IDE, а не
пользовательская реализация, которая использует
Параметр bool по-другому?
Это не так. GC знает о Finalize и только Finalize. Одноразовый - это шаблон для программиста , а не сборщика мусора . Вот почему шаблон требует написания финализатора, который вызывает Dispose (false) самостоятельно.
Причиной наличия двух путей является то, что метод Dispose можно назвать двумя способами. Обычный опыт заключается в том, чтобы вызывать его явно, после чего все управляемые объекты существуют, и истинный путь избавится от них и освободит любые неуправляемые ресурсы. Ложный путь будет использоваться при вызове финализатора, и в этот момент вы не можете предполагать, что ни в одном из ваших полей еще не были вызваны их собственные финализаторы. Разделенный путь не влияет на граф объектов или на то, когда будут собраны содержащиеся объекты.