我有一個關於延遲執行和數據處理的問題。在「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
哦一個方面的說明,而不是在計數器命中兩個時使用'break',只需在'ParseFile'的末尾添加一個'Take(2)'。 – Servy
如果您想要對迭代器塊中發生的事情有一個很好的解釋,或者只是查看語言規範,就像他經常暗示的那樣,拿起Jon Skeet的書「C#深入」一書。 –