2011-08-01 10 views
2

私には、例えば、それを確認する方法がわからない:ストリーム内のストリームのラッピング - ラップされたストリームは適切に配置されますか?

using (var stream = new StreamWriter(someStream)) 
{ 
    stream.Write(""); 
} 

これは次のように動作します:

using (var stream1 = someStream) 
{ 
    using (var stream2 = new StreamWriter(stream1)) 
     stream.Write(""); 
} 

または私はGZipStreamまたは任意の他のストリームにラップしたい場合は...最初の例はすべての下層ストリームを処理しますか?

更新:最後に、それは私を襲った

- 自分自身Streamクラスを実装:

class MyStream : Stream 
{ 
    // fake stream implementation 

    protected override void Dispose(bool disposing) 
    { 
     Console.WriteLine("disposing in my class"); 
     base.Dispose(disposing); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyStream stream = new MyStream(); 
     DoSomething(stream); 
     stream.Dispose(); 

     Console.WriteLine("end of program"); 
    } 

    private static void DoSomething(Stream stream) 
    { 
     using (var writer = new StreamWriter(stream)) 
     { 
      Console.WriteLine("inside using statement"); 
     } 

     Console.WriteLine("after writing"); 
    } 
} 

と結果:

inside using statement 
disposing in my class 
after writing 
disposing in my class 
end of program 

答えて

2

は、最上位のストリームカスケードに近いの呼び出しをそれらをすべて閉じますが、これは開かれたものと開かれていないものを見極めるのは難しいため、お勧めしません。他の回答者が言ったように、使用ブロックは宗教的に使用してください。

希望すると便利です。

2

No IDisposableオブジェクトの基になるストリームを廃棄することはできません(ただし、StreamWriterの場合は、そのように記載されています)。一般的にそれに依存しないでください。

ネストされたusingステートメントを使用する必要があります。

+0

downvoter ....なぜですか?私が言ったことは正しかった、あなたは*任意のメンバ/パラメータIDisposableオブジェクトにDisposeを呼び出すIDisposableを実装するオブジェクトに*依存するべきではありません。 –

+0

クラッシュすることなくクラスをラッピングすることに頼ることができないと言っているように - 私は絶え間なく行動することができないフレームワークを使用する点は何ですか? – argh

+0

彼の例で使用されているクラスの場合は問題ありませんが、OPがそれを意味するとすれば、IDisposableオブジェクトのすべての組み合わせに対して問題はありません。 –

2

ここでは2つの概念を混在させています。

メインブロックはブロックを使用してネストされ、2番目のサンプルではそれらを正しく使用しています。

第2の問題は、ネスト/ラップ/リンクディスポーザブルクラスです。 StreamWriterとStreamの場合、Writerはストリームを閉じます。しかし、あなたはそれを知りたくはありません、使用パターンを使用するだけです。

小さなチップでは、以下の代替レイアウトが読みやすく、管理しやすくなります。 GZipStreamを追加すると、ブロックを使用して3つ以上のネストされます。

using (var stream1 = File.Create(...)) 
using (var stream2 = new StreamWriter(stream1)) 
{  
     stream2.Write(""); 
} 
+0

一般的に私はこれに同意するが、知識の依存関係は避けるべきであるが、この場合には文書化されているので、内部ストリームオブジェクトを処分しないことは完全に安全である。 –

+0

@Lasse正しいが、私はそれをとにかく避ける傾向がある。ライターの後にストリームを使用するような適切な状況を除いて。 –

+0

私はあなたに完全に同意します、私はこのようなことをいつでも処分します。この特定のケースではそれは問題ではないと私はまだ知っていますが、私はまだそれを行います。私はこのコード行を「最適化」したいと思ったからといって、私のコードや奇妙なことを考えて、私のコードや仲間の開発者が欲しいとは思っていません。 –

関連する問題