Нужно ли закрывать 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.