关于c#:循环函数结果时foreach如何工作?

How does foreach work when looping through function results?

假设我有以下代码:

1
2
3
4
foreach(string str in someObj.GetMyStrings())
{
    // do some stuff
}

循环的每次迭代都会调用EDOCX1[0]吗?是否最好改为执行以下操作:

1
2
3
4
5
List<string> myStrings = someObj.GetMyStrings();
foreach(string str in myStrings)
{
    // do some stuff
}


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

1
2
3
4
foreach (Foo f in GetFoos())
{
    // Do stuff
}

相当于:

1
2
3
4
5
6
7
8
using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
{
    while (iterator.MoveNext())
    {
        Foo f = iterator.Current;
        // Do stuff
    }
}

请注意,迭代器是在末尾处理的-这对于从迭代器块处理资源特别重要,例如:

1
2
3
4
5
6
7
8
9
10
11
public IEnumerable<string> GetLines(string file)
{
    using (TextReader reader = File.OpenText(file))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

在上面的代码中,您确实希望在完成迭代后关闭文件,并且编译器巧妙地实现了IDisposable,以使其正常工作。


不。。函数将被调用一次以获取IEnumerable。然后会重复调用moveNext和current。


getmyStrings()重新运行IEnumerable类型的对象。运行时知道如何处理这个问题。它调用ienumerable.getEnumerator(),然后在该枚举器对象上调用moveNext()和current。


如果你陷入了一个"一切都是一样的"的局面,就把问题解决掉;对于(int x=0;x