Я разговаривал с человеком об использовании оператора (). Он сказал, что если мы НЕ будем использовать оператор using () для чего-то вроде StreamWriter, если произойдет какое-либо исключение, ресурс НИКОГДА не будет собран.
Инструкция using
не имеет ничего общего со сборкой мусора. Как только объект не имеет живых ссылок, он становится пригодным для сборки мусора.
Я понимаю, что нужно использовать оператор using (), но я не согласен с тем, что ресурс никогда не будет собран.
О, тогда вы правы.
Я думаю, что использование оператора () вызовет метод dispose () в конце, который может сделать коллекцию намного быстрее.
Это может или не может сделать сбор быстрее. Обычно для метода dispose вызывается GC.SupressFinalize(object)
, что означает, что финализатор не будет вызываться при сборке мусора. Вместо этого объект будет просто собран. Так что это может сделать сбор быстрее.
Если вы намереваетесь сказать, что это приводит к тому, что объект будет собран немедленно, а не позже, тогда это будет неправильно. Приемлемые объекты собираются всякий раз, когда сборщик мусора доходит до него, никогда прежде, и объект становится подходящим, как только у него нет живых ссылок, на которые оператор using
мало влияет. На самом деле, поскольку блок finally оператора using содержит живую ссылку, я могу представить себе сценарии, в которых он может увеличить время жизни объекта, но этот эффект не учитывается, поскольку управление временем жизни объекта не смысл использования. Детерминированное избавление от неуправляемых ресурсов является точкой использования оператора.
Однако, даже если мы не используем using (), мы не вызываем dispose (), ресурс все еще может быть собран посредством gabage collection, хотя это может занять гораздо больше времени.
Опять же, использование и удаление обычно не влияют на время жизни объекта. Он влияет только на состояние неуправляемых ресурсов (при условии, что метод Dispose реализован правильно). Вы правы, что объект все еще будет собран.