在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
翻译方面很有趣.
归档时间: |
|
查看次数: |
338 次 |
最近记录: |