は、次のコードを考えてみましょう。一方でライターが破棄されたときにストリームが破棄されるのはなぜですか?
using (var ms = new MemoryStream())
{
using(var writer = BinaryWriter(ms))
{
writer.Write(/*something*/);
writer.Flush();
}
Assert.That(ms.Length > 0); // Throws ObjectDisposedException
}
を、使い捨てのオブジェクトは、それのリソースを処分しなければなりません。私はそれを得るが、一方で、オブジェクトは作成せず、このリソースを所有していない、それは提供された - >呼び出しコードはそれに責任を負うべきである...いいえ?
私はこのような任意の他の状況を考えることはできませんが、それは自身の処分でそれらを処分するために使い捨てのオブジェクトを受け取る任意のクラスのためのフレームワークで一貫したパターンですか?
オブジェクトは、*所有していないものを廃棄してはなりません。オブジェクトを直接インスタンス化する以外の方法でオブジェクトの所有権を取得することができます(最も一般的には、ファクトリメソッドを呼び出すことによって)。ファクトリメソッドは通常、単一のオブジェクトだけを返すので、メソッドによって取得されたすべてのリソースがそのオブジェクトによって所有される必要があります。 'StreamWriter'が渡されたストリームの所有権を持つようにすると、ファクトリメソッドがストリームを合法的に構築し、それをカプセル化する' StreamWriter'を返すことが可能になります。 – supercat
@supercat eh no。私はあなたに同意します。「オブジェクトは所有していないものを処分すべきではありません。それはそれを言う正しい方法です。しかし、この場合ではありません。 StreamWriterクラス自体を設計するには、呼び出し元がストリームをどのように扱っているのか、どちらにも当てはまりません。ストリームが複数のリーダーで使用される場合を考慮してください。次に、それを破棄したいかどうかに応じて、文を使って条件付きでStreamReaderをラップする必要がありますか? IDisposableは、ステートメントを使用しています。質問はありません。 –
適切なアプローチは、 'StreamReader' /' StreamWriter'のコンストラクタが、呼び出し側が所有権が転送されるかどうかを(それ以降のバージョンの.NETで)行うことができるようにすることです。さもなければ、 'StreamReader'から取り出されたオーディオデータを非同期的に再生する方法を書く方法を考えてみましょう。オーディオを再生しているコードは、基礎となるストリームについては何も知らないかもしれません。また、 'StreamReader'を構築するコードは、再生コードがいつ実行されるか分かりません。ストリームが純粋にオーディオ再生の目的のために開かれた一般的なケースでは... – supercat