【发布时间】:2013-01-07 21:00:47
【问题描述】:
我有一个关于延迟执行和数据处置的问题。
考虑以下示例:
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 中的读取器释放,还是仍然在上下文中考虑并锁定文件打开直到程序本身关闭?
【问题讨论】:
-
编写一个快速控制台应用程序并找出答案:)
-
附注一下,当计数器达到两个时不要使用
break,只需在ParseFile的末尾添加Take(2)。 -
如果您想很好地解释迭代器块中发生的事情,或者像他经常建议的那样,只需查看语言规范,请阅读 Jon Skeet 的“C# in Depth”一书。
-
@Servy 您下面的答案正是我想要的。我知道有很多更好的方法可以从文件中只提取 2 行。这只是一个简单的例子来展示我想要达到的目的。再次感谢您的帮助!
标签: c# file-io using deferred-execution