在遍历函数结果时,foreach如何工作?

Ada*_*ear 31 .net c# foreach

假设我有以下代码:

foreach(string str in someObj.GetMyStrings())
{
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

someObj.GetMyStrings()在循环的每次迭代中调用?改为做以下事情会更好吗:

List<string> myStrings = someObj.GetMyStrings();
foreach(string str in myStrings)
{
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 48

该函数只调用一次,返回一个IEnumerator<T>; 之后,MoveNext()方法和Current属性用于迭代结果:

foreach (Foo f in GetFoos())
{
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

有点相当于:

using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
{
    while (iterator.MoveNext())
    {
        Foo f = iterator.Current;
        // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,迭代器位于末尾 - 这对于从迭代器块处理资源尤其重要,例如:

public IEnumerable<string> GetLines(string file)
{
    using (TextReader reader = File.OpenText(file))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,您确实希望在完成迭代时关闭该文件,并且编译器会IDisposable狡猾地实现该工作.


Nes*_*tor 18

不..函数将被调用一次以获取IEnumerable ..然后将重复调用MoveNext和Current.