的foreach在C#中重新计算

如果我写在C#中的foreach说明书:

foreach(String a in veryComplicatedFunction()) { }

它会计算veryComplicatedFunction每次迭代或只有一次,并保存它的地方?

--------------解决方案-------------

你的问题是回答了规范,其中规定第8.8.4:


上述步骤,如果成功的话,毫不含糊地产生一个集合C型,枚举类型E和元素类型T的形式的foreach语句

foreach (V v in x) embedded-statement

然后扩展为:

{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}



正如你所看到的,在扩张表达式x只计算一次。

它只会计算一次

这取决于你所说的曾经的意思。 如果您有类似下面的方法:

public static IEnumerable<int> veryComplicatedFunction()
{
List<string> l = new List<string> { "1", "2", "3" };
foreach (var item in l)
{
yield return item;
}
}

控制将返回到所述方法中,每个收率之后调用veryComplicatedFunction。 所以,如果他们共享列表L,那么你可能有一些奇怪的结果。 确保消防方式来消除那样的问题,将呼吁veryComplicatedFunction则ToArray扩展。

veryComplicatedFunction可能返回IEnumerable<string>这应该意味着它的计算只进行一次,它流及其结果以某种方式。 但是,没有看到实际的方法,就没有办法保证它做什么。 什么是保证的是veryComplicatedFunction只调用一次,什么foreach做的是遍历方法的回报。

它应该计算它只有一次。 作为一个方面说明了verycomplicatedfunction()必须返回IEnumerableIEnumerable<T>或具有一个公共的GetEnumerator()方法的对象。

如果每次计算它,它会引起痛苦的世界,如果您的功能是根据一些动态如当前时间。 它应该一次计算。

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.167 (s). 10 q(s)