たこぜりー研究室

大腸菌DNAは4.64Mbp。酵母は13Mbpで、ヒトは3Gbp

スポンサーサイト

#
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

.NET 4 の File.ReadLines メソッドについて

#540
Bug in the File.ReadLines(..) method of the .net framework 4.0 - efreedom を見て、これは気を付けたほうがいいかもと思った。

コードを再掲すると、
IEnumerable<string> lines = File.ReadLines("file path");
foreach (string line in lines)
{
  Console.WriteLine(line);
}
foreach (string line in lines)
{
  Console.WriteLine(line);
}

これが二回目の foreach で ObjectDisposedException が発生するというもの。

ポイントは ReadLines メソッドを実行した時点でファイルを開いているということ。
なので、一回目の foreach が終わった段階で Dispose メソッドが呼ばれ、その後は使用不能になる。

質問者が期待している通りにするには、ReadLines メソッドを実行した時点では、ファイルパスだけを保持しておき、GetEnumerator メソッドを実行した時点でファイルを開くようにすればいいが・・・。
なんかこっちのほうが遅延評価っぽくないか?
結果的に GetEnumerator メソッドが実行されなかったら、ファイルはいつ閉じる?

まぁまず上のような使い方はしないと思うのだが、LINQ に組み込むと上のようなことをしていそうで心配、かもしれない。
普通の LINQ to objects と同じように扱わない方がよさそうです。
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。