2011-10-10 3 views

答えて

42

使用ブロックの有効範囲を離れるとすぐに、ストリームが閉じられて処理されます。 Close()はFlush()を呼び出すので、手動で呼び出す必要はありません。

+0

終わり?私はそれがストリームを廃棄することを知っているだけで、毎回最後にcloseメソッドを呼び出します。 –

+9

これは必須ではありませんが、Disposeは常にストリームを閉じ、Closeはストリームを最初にフラッシュします。 – nos

+1

@FelixCzylwik:使用終了によりCloseが呼び出されなかった場合は、開いているストリームがたくさんあり、SQLConnectionsがそこにオープンしていました...:D –

0

異なる場合があります。StreamDisposeメソッドではFlush()と呼ばれ、FileStreamなどの例外はありません。これは、ストリームオブジェクトの中には、バッファを使用しないため、Flushへの呼び出しを必要としないものがあるためです。 MemoryStreamのようなものは、アクションが取られないことを保証するメソッドを明示的にオーバーライドします(ノーオペレーションにします)。
これは、あなたが余分な呼び出しをしたくない場合は、使用しているStreamサブクラスがDisposeメソッドで呼び出しを実装し、必要であるかどうかをチェックする必要があることを意味します。

かかわらず、それだけで読みやすくするためにとにかくそれを呼び出すために良いアイデアかもしれ - 一部の人々が使用して文の最後にClose()を呼び出すのと同じように:閉じる呼び出しを使用しての

using (FileStream fS = new FileStream(params)) 
using (CryptoStream cS = new CryptoStream(params)) 
using (BinaryWriter bW = new BinaryWriter(params)) 
{ 
    doStuff(); 
    //from here it's just readability/assurance that things are properly flushed. 
    bW.Flush(); 
    bW.Close(); 
    cS.Flush(); 
    cS.Close(); 
    fS.Flush(); 
    fS.Close(); 
} 
+1

私は、フラッシュとクローズドコールを追加すると、読みやすさとメンテナンス性に害を及ぼしていると主張します。 usingステートメントは、たとえ例外がスローされたとしても、オブジェクトが適切に処分されていることを保証するものです。 – Palec

+0

@パルク私はそのポジションを理解していますが、これは私が見たものから、多くの開発者の間で少しずつ分けられる標準です。 – TheHitchenator

+0

@パレートまた、私の答えで述べられているように - デフォルトではストリームは、disposeメソッドで 'Flush()'を呼び出さないので、それを考慮していない人が作成した非標準ストリームを使用している場合usingステートメントはバッファを適切にフラッシュしません。このため、手動でフラッシュするのが良い方法だと言えます。必要ない場合は何もしませんが、そうであればバッファが適切に処分されるようにします。 – TheHitchenator

関連する問題