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