在C#迭代器块中是否有任何方法可以提供一个代码块,该代码块将在foreach结束时自动运行(或者自然地被打破),比如清理资源?
我提出的最好的方法是使用using构造,这很好,但需要一个IDisposable类来进行清理.例如:
public static IEnumerable<string> ReadLines(this Stream stream)
{
using (StreamReader rdr = new StreamReader(stream))
{
string txt = rdr.ReadLine();
while (txt != null)
{
yield return txt;
txt = rdr.ReadLine();
}
rdr.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
try/ finally工作正常,只要呼叫者使用foreach或手动调用Dispose上IEnumerator<T>.说实话,如果要清理资源,那么using声明可能是最好的方式 - 如果你使用的资源需要清理但是没有实现IDisposable,那本身就是一个问题:)
你可以在迭代器块中做些什么限制,正如Eric Lippert的博客所解释的那样,但在大多数情况下它都能很好地工作.
您可能会发现我关于迭代器块实现的文章在finally翻译方面很有趣.