Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ';最后';迭代器中的块_C#_Iterator - Fatal编程技术网

C# ';最后';迭代器中的块

C# ';最后';迭代器中的块,c#,iterator,C#,Iterator,在C#迭代器块中是否有任何方法可以提供一个代码块,该代码块将在foreach结束时运行(自然地或通过中断),比如清理资源 我想到的最好的方法是使用using构造,这很好,但确实需要一个IDisposable类来进行清理。例如: public static IEnumerable<string> ReadLines(this Stream stream) { using (StreamReader rdr = new StreamReader(strea

在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();
        }
    }
公共静态IEnumerable可读行(此流)
{
使用(StreamReader rdr=新StreamReader(stream))
{
字符串txt=rdr.ReadLine();
while(txt!=null)
{
收益率;
txt=rdr.ReadLine();
}
rdr.Close();
}
}

尝试
/
最后
工作正常,只要调用方使用
foreach
或手动调用
IEnumerator
上的
Dispose
。老实说,如果要清理资源,使用
语句可能是最好的方式——如果您使用的资源需要清理,但没有实现
IDisposable
,这本身就是一个问题:)

在迭代器块中可以执行的操作有一定的限制,但在大多数情况下都可以很好地工作


您可能会对
finally
的翻译方式感兴趣。

try/finally
在这种情况下起作用

public static IEnumerable<string> ReadLines(this Stream stream)
{
    StreamReader rdr = new StreamReader(stream);

    try
    {
        string txt = rdr.ReadLine();
        while (txt != null)
        {
            yield return txt;
            txt = rdr.ReadLine();
        }
        rdr.Close();
    }
    finally
    {
        rdr.Dispose();
    }
}
公共静态IEnumerable可读行(此流)
{
StreamReader rdr=新的StreamReader(流);
尝试
{
字符串txt=rdr.ReadLine();
while(txt!=null)
{
收益率;
txt=rdr.ReadLine();
}
rdr.Close();
}
最后
{
Dispose();
}
}