Ответ 1
Вы говорите о двух очень разных вещах.
Объект будет удален, как только заканчивается using
-block. Это ничего не говорит о том, когда собирается сбор мусора. Единственное время, когда освобождается память кучи, возникает сбор мусора - это происходит только под давлением памяти (если вы не используете явно GC.Collect
).
Удаление объекта просто означает вызов его метода Dispose
. Это чаще всего означает освобождение либо дефицитного ресурса, либо собственного ресурса (на практике все скудные ресурсы являются родными - сокетами, файлами и т.д.). Теперь удобно, что время жизни одноразового объекта в вашем случае ограничено по объему, поэтому его теоретически можно собрать, как только заканчивается using
-блок, однако это на самом деле не происходит на практике, так как .NET runtime пытается избежать коллекций - они дороги. Таким образом, пока вы не перейдете порог распределения памяти, сбор не произойдет, хотя у вас есть мертвый объект в куче.
Итак, какая точка Dispose
? Не имеет ничего общего с управляемой памятью. Вы не заботитесь о управляемой памяти, и вы не должны ожидать, что Dispose
действительно будет вызван - это не обязательно. Единственное, что должно быть вызвано средой выполнения, - это финализатор, и вы можете использовать его только для утилизации собственных ресурсов - на самом деле, нет гарантии, что объекты, к которым у вас есть ссылка, все еще существуют к моменту завершения финализатора - управляемая память, возможно, уже была восстановлена к тому времени. Вот почему вы никогда не обрабатываете управляемые ресурсы в финализаторе.
Так что да, она была совершенно права. Дело в том, что IDisposable
не имеет ничего общего с сборщиком мусора. Убранный не означает сбор мусора.