何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 35955
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

.NET Framework で、IDisposable インターフェイスを実装したクラスのインスタンスは、使用後に Dispose メソッドを呼び出す必要があります。ところが、呼び出すタイミングに注意が必要な場合があります。

System.IO.StreamReader クラスは、System.IO.TextReader クラスを継承しています。TextReader クラスは IDisposable インターフェイスを実装しているので、Dispose メソッドを実装しています。ただし、Dispose メソッドは明示実装により隠蔽されており、Close メソッドが代替メソッドとして用意されています。

StreamReader クラスのコンストラクタは、いくつかのオーバーロードがあります。そのうちのひとつに、System.IO.Stream クラスのインスタンスを引数にするものがあります。このコンストラクタを使用する場合、Close メソッドの呼び出しには注意が必要です。

IDisposable インターフェイスは、そのクラスがアンマネージドリソースを使用することを、開発者に知らせます。StreamReader クラスにおけるアンマネージドリソースは、ファイル名を指定した場合はファイルハンドル、ストリームを指定した場合はストリームです。

この辺でピン!と来ましたか?ストリームを引数にして生成したインスタンスで Close メソッドをコールすると、元にしたストリームの Close メソッドもコールされます。。。FileStream を、リード/ライトで開いて、TextReader で読み込み、リワインドして TextWriter で上書き……なんて処理をするとき、TextReader.Close は、TextWriter.Close をするときまで呼び出してはいけません。元にしたストリームが閉じてしまいます。

TextWriter.Close メソッドが破棄するものがストリームしかなければ、TextWriter.Close メソッドをコールする必要もありませんが、私は ildasm を通して見るようなことはしていませんし、「何でこれはしないの?」と、後から混乱する元になるので、「しなくてもいい」とは言いません。

投稿日時 : 2006年2月11日 10:24
コメント
タイトル
名前
Url
コメント