假设我有以下代码:
foreach(string str in someObj.GetMyStrings())
{
    // do some stuff
}
将someObj.GetMyStrings()在循环的每次迭代中调用?改为做以下事情会更好吗:
List<string> myStrings = someObj.GetMyStrings();
foreach(string str in myStrings)
{
    // do some stuff
}
?
Jon*_*eet 48
该函数只调用一次,返回一个IEnumerator<T>; 之后,MoveNext()方法和Current属性用于迭代结果:
foreach (Foo f in GetFoos())
{
    // Do stuff
}
有点相当于:
using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
{
    while (iterator.MoveNext())
    {
        Foo f = iterator.Current;
        // Do stuff
    }
}
请注意,迭代器位于末尾 - 这对于从迭代器块处理资源尤其重要,例如:
public IEnumerable<string> GetLines(string file)
{
    using (TextReader reader = File.OpenText(file))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}
在上面的代码中,您确实希望在完成迭代时关闭该文件,并且编译器会IDisposable狡猾地实现该工作.
| 归档时间: | 
 | 
| 查看次数: | 3173 次 | 
| 最近记录: |