2009-07-03 10 views
9

このコードを持つ:C#BinaryWriterまたはBinaryReaderをusingブロックで閉じる必要がありますか?

using (BinaryWriter writer = new BinaryWriter(File.Open(ProjectPath, FileMode.Create))) 
{ 
    //save something here 
} 

我々はBinaryWriterをクローズする必要がありますか?そうでない場合、なぜですか?

+0

違うタイプであるにもかかわらず、これはhttp://stackoverflow.com/questions/1070667/is-is-necessary-to-dispose-dbcommand-after-use/の複製です。私は閉会に投票したいが、その日の私の限界に達している。私はそれを実装するすべてのクラスのために "私はIDisposableを実装するクラスを処分する必要があります"という質問はしないことをお勧めします。あなたのお気に入りのIDisposable質問の複製としてクローズすることを検討してください。 –

+0

これは、ドキュメント/ APIの設計上の欠陥であると考えています。間違いがあると警告が表示され、Close()呼び出しがDisposeと同等であることを文書に明記する必要があります。最初は完全に冗長なClose()呼び出し)。 –

答えて

18

ブロックがすべてusingブロックにラップされている限り、明示的にCloseを呼び出す必要はありません。

ブロックusingブロックはオブジェクトが確実に廃棄され、BinaryWriterではCloseDisposeのメソッドを交換できます。 (Closeメソッドは、背後でDisposeを呼び出すだけです)。

4

そこにあるコードでは、使用ブロックを終了するとファイルを閉じるので、closeを呼び出す必要はありません。

usingステートメントを使用しない唯一の理由は、BinaryWriterで処理した後でもファイルを開いておきたい場合です。その場合は、BinaryWriterに渡す代わりに参照を保持する必要があります。そのようなコンストラクタ。

4

コード例に従ってusingステートメントを使用すると、Disposeが呼び出され、基になるストリームが閉じられます。あなたはリフレクターを介してこれを見ることができます:

protected virtual void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     this.OutStream.Close(); 
    } 
} 
0

使用してブロックをautomaticllyにバイナリライターを閉じてGC'edされる状態に入れます。ブロックの使用は、ストリームの例外処理とクローズを行うための構文的砂糖です。

0

ライターを使用ブロックにラップすると、ライターが廃棄されると自動的にクローズされます。この場合、ライターを明示的に閉じる必要はありません。

関連する問題