在迭代器中"终于"阻塞

JDu*_*ley 8 c# iterator

在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)

Jon*_*eet 6

try/ finally工作正常,只要呼叫者使用foreach或手动调用DisposeIEnumerator<T>.说实话,如果要清理资源,那么using声明可能是最好的方式 - 如果你使用的资源需要清理但是没有实现IDisposable,那本身就是一个问题:)

你可以在迭代器块中做些什么限制,正如Eric Lippert的博客解释的那样,但在大多数情况下它都能很好地工作.

您可能会发现我关于迭代器块实现的文章finally翻译方面很有趣.