yield关键字向编译器指示它所在的方法时迭代器块,在该块中yield关键字与return关键字结合使用向枚举器对象提供值,yield与break结合使用表示迭代结束。
以下为yield语句的两种形式:
yield return <expression>;
yield break;
使用一个 yield return 语句返回每个元素一个节点。
使用 foreach语句或 LINQ 查询,则使用迭代器方法。 foreach 循环的每次迭代调用迭代器方法。 当 yield return 语句在迭代器方法时为止,expression 返回,并且,代码的当前位置保留。 执行从该位置下次重新启动迭代器函数调用。
可以使用 yield break 语句结束迭代
如:
public static IEnumerable Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}
static void Main(string[] args)
{
foreach (int i in Power(2, 8))
{
Console.WriteLine(i);
}
Console.ReadLine();
}
输出结果为:
2
4
8
16
32
64
128
256
如上例子则是当调用Power方法时,它执行到yield return result语句,即停止在当前位置,返回一个包含数字幂的可枚举对象,注意该方法返回的是IEnumerable类型。
在使用 yield return 或 yield break 语句时,则表明它的方法、运算符或 get 访问器是迭代器。 迭代器方法、运算符或 get 访问器的声明必须满足以下要求:
- 不允许不安全块
- 返回类型必须是 IEnumerable、IEnumerable<T>、IEnumerator或 IEnumerator<T>。
- 方法、运算符或访问器不能有任何 ref 或 out 或参数
- yield return 语句不能位于 try-catch 块。 yield return 语句可以位于在尝试 try-finally 块语句。
- yield break 语句可以位于 try 块或 catch 块,而不是 finally 块。
- 如果 foreach 主体 (在迭代器方法的外部) 引发异常,finally 在迭代器方法执行块。