1. ホーム
  2. c#

[解決済み] ディスポーザブルストリームリーダは、ストリームを閉じるのですか?

2022-05-05 22:22:06

質問

私は書き込みを行うメソッドにストリームを送信しており、それらのメソッドでバイナリリーダ/ライタを使用しています。リーダライタがディスポーザブルになったとき、そのリーダライタは using または単にそれが参照されないとき、ストリームは同様に閉じられますか?

BinaryReader/Writerを送りたいところですが、StreamReaderも使っているので(回りくどいかもしれませんが。GetLineとReadLineにしか使ってません)。これは、Writer/Readerがクローズされるたびにストリームがクローズされるのでは、かなり面倒です。

解決方法は?

はい。 StreamReader , StreamWriter , BinaryReaderBinaryWriter を呼び出すと、その基礎となるストリームをすべてクローズ/ディスポします。 Dispose があります。これらは しない リーダライタがガベージコレクトされた場合は、ストリームを破棄する必要があります。 using ステートメントを使用します。(実際、これらのクラスはどれもファイナライザを持っていませんし、また持つべきでもありません)。

個人的には、ストリームにもusingステートメントがあったほうがいいと思います。をネストすることができます。 using 文は中括弧なしで非常にきれいに表示されます。

using (Stream stream = ...)
using (StreamReader reader = new StreamReader(stream, Encoding.Whatever))
{
}

たとえ using 文はやや冗長です。 StreamReader コンストラクタが例外を投げるので、私はこれをベストプラクティスと考えています。 StreamReader を作成し、後でストリームを直接使用すれば、正しい廃棄のセマンティクスを既に持っていることになります。