Нужно ли закрывать C# BinaryWriter или BinaryReader в блоке using?
имея этот код:
using (BinaryWriter writer = new BinaryWriter(File.Open(ProjectPath, FileMode.Create)))
{
//save something here
}
нужно ли закрывать BinaryWriter? Если нет, то почему?
5 ответов
пока все это завернуто в using
блок тогда вам не нужно явно вызывать Close
.
на using
блок гарантирует, что объект будет удален, а Close
и Dispose
методы взаимозаменяемы на BinaryWriter
. (The Close
метод просто называет Dispose
за кулисами.)
ввод его в оператор using в соответствии с вашим примером кода вызовет Dispose, который закрывает базовый поток, поэтому нет. Вы можете видеть это через рефлектор:
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
this.OutStream.Close();
}
}
с кодом, который у вас есть, он закроет файл после выхода из блока using, поэтому вам не нужно вызывать close explcitly.
единственная причина не использовать оператор using - это если вы хотите, чтобы файл все еще был открыт после того, как вы закончите с BinaryWriter, и в этом случае вы должны держаться за ссылку на него, а не передавать его в конструктор.
блок using автоматически закроет двоичный писатель и поместит его в состояние, которое будет GC'Ed. Использование блоков является синтаксическим сахаром для обработки исключений и закрытия потока самостоятельно.
обернув writer в блок using, закрытие автоматически произойдет, когда писатель будет удален. Поэтому в этом случае вам не нужно явно закрывать writer.