请考虑以下示例:
class YieldTest
{
static void Main(string[] args)
{
var res = Create(new string[] { "1 12 123", "1234", "12345" });
}
static IEnumerable<int> Create(IEnumerable<string> strings)
{
foreach(string s in strings)
{
yield return s.Length;
if(s.Contains(' '))
{
string[] tokens = s.Split(' ');
foreach(string t in tokens)
{
yield return t.Length;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Create
回复{8,1,2,3,4,5} 的召唤.
让我困惑的是执行yield return语句后的代码.(他们为什么要命名yield return
而不只是yield
?)文档告诉我们
在迭代器方法中达到yield return语句时,将返回表达式,并保留代码中的当前位置.
那是什么意思?返回何处发生?什么是迭代器方法?
dca*_*tro 11
这意味着编译器将您的代码转换为状态机.
当你打电话给Create
方法时,你会得到一个IEnumerable<T>
.然后你可以打电话GetEnumerator()
给它并获得一个IEnumerator<T>
.
现在,每次通话时间MoveNext
在这个迭代器,你的代码将执行,直到它找到的第一个yield
声明(无论是yield return
或yield break
).
如果它命中a yield return x
,则MoveNext
返回true并且迭代器的Current
属性将被设置为x
,并且下次调用时将执行其余代码MoveNext
.
这种情况发生,直到没有更多的代码要运行或代码命中yield break
.那时,MoveNext
将返回false.
yield return 1;
yield return 2;
yield return 3;
Run Code Online (Sandbox Code Playgroud)
调用MoveNext
这段代码将在前三次返回true,并且在每次迭代时,Current
将设置为1,2和3.
编辑2:
关于yield return ??
语法,来自Eric Lippert的Ambiguous Optional Parentheses,第三部分
当他们设计C#2.0时他们遇到了这个问题:
yield(x);
这是否意味着"在迭代器中产生x"或"使用参数x调用yield方法?" 通过将其更改为
yield return(x);
它现在是毫不含糊的; 它不可能意味着"称之为收益率方法".
归档时间: |
|
查看次数: |
5112 次 |
最近记录: |