遅延実行とデータの廃棄に関する質問があります。"using"ステートメント内でyieldを使用する場合、Disposeはいつ発生しますか?
は、次の例を考えてみましょう:
private IEnumerable<string> ParseFile(string fileName)
{
using(StreamReader sr = new StreamReader(fileName))
{
string line;
while((line = sr.ReadLine()) != null)
{
yield return line;
}
}
}
private void LineReader(string fileName)
{
int counter = 0;
foreach(string line in ParseFile(fileName))
{
if(counter == 2)
{
break; // will this cause a dispose on the StreamReader?
} else
{
Console.WriteLine(line);
counter++;
}
}
}
break
文はすぐにParseFile
で読者が処分するようになりますか、それはまだ文脈で考慮され、プログラム自体が閉じられるまで開いているファイルをロックしますか?
クイックコンソールアプリを書いてみてください:) – jjxtra
ああ、2番目のヒット時に 'break'を使うのではなく、' ParseFile'の最後に 'Take(2)'を追加するだけです。 – Servy
イテレータブロックで何が起こっているのかを本当に分かりやすくするために、Jon Skeetの著書「C#in Depth」を読んでください。 –