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 } |
号
?
函数只调用一次,返回
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; } } } |
在上面的代码中,您确实希望在完成迭代后关闭文件,并且编译器巧妙地实现了
不。。函数将被调用一次以获取IEnumerable。然后会重复调用moveNext和current。
getmyStrings()重新运行IEnumerable类型的对象。运行时知道如何处理这个问题。它调用ienumerable.getEnumerator(),然后在该枚举器对象上调用moveNext()和current。
如果你陷入了一个"一切都是一样的"的局面,就把问题解决掉;对于(int x=0;x