Я вижу много пример кода, который обертывает FileStream в блоке using
или вызывает явно Dispose().Мне действительно нужно вызвать FileStream.Close/Dispose
Нужно ли мне это делать?
В моем (возможно упрощенном) понимании, C# представляет собой сборник данных, собранный с мусором, и когда объект выходит за пределы области видимости, он помечен для коллекции. Я предполагаю, что сборщик мусора достаточно умен, чтобы вызвать Dispose для меня на любом объекте, который IDisposable. Это правда?
Кроме того, я понимаю, что GC в C# не является детерминированным и не происходит непосредственно в ответ на объекты, выходящие из области видимости, по соображениям производительности. Итак, если я открываю миллион файлов в секунду, а не удаляя их, я могу создать много файлов. Это на самом деле проблема?
Я мог представить, что сборщик мусора на C# достаточно похож на GC в ответ на программу, которая поглощает системные ресурсы, такие как дескрипторы файлов. Даже если это не так, я могу представить, что открытые дескрипторы файлов в основном бесплатны в современной серверной ОС.
Значит, Dispose является педантичным?
Сборщик мусора является недетерминированным. Невозможно узнать, сколько времени потребуется, чтобы собрать объект. В то же время он захватывает ресурсы. Но так как вы знаете, когда вы закончите с этим, вы можете уничтожить. –
Спасибо, Джон. Я указал на это, и это не мой вопрос. –
Я видел, что приложение в производстве терпит неудачу, потому что оно не утилизировало экземпляры SmtpClient и исчерпало какой-то базовый ресурс, который он использует. Прошли месяцы, прежде чем условия были подходящими для этого. Если класс реализует IDisposable, его экземпляры должны быть явно удалены. – hatchet