当使用yield关键字时,这就意味着该函数返回的是一个迭代器(iterator),不用自己维护一个迭代器内部的状态管理(比如C++中的itereator<T>,或实现C#中实现的接口IEmuerator<T>),其使用模式如下:
yield return <Expression>;
yield break;
其中第二种用于for循环终止。这样的模式也就实现了Linq的查询,但注意yield使用要求如下:
1. 迭代器函数不能有ref/out参数。
2. 迭代器函数返回必须是IEnumberable、IEnumerable<T>、IEnumerator或IEnumerator<T>。
3. yield 不能用于匿名函数返回。
4. yield return不能位于try/catch语句中,可以位于try/finally语句try语句中。
5. yield break可以位于try/cache语句中,不能位于try/finllay语句finally语句中。
测试代码如下:
class Program
{
static IEnumerable<int> test()
{
for (int i = 0; i < 4; ++i)
{
if (i == 3) yield break;
yield return i;
}
}
public static IEnumerable<string> Names {
get {
yield return "hello";
yield return "test";
}
}
static void Main(string[] args)
{
IEnumerable<int> l = test();
foreach (var item in new List<int>(l))
{
Console.WriteLine("item:{0}", item);
}
foreach (var item in Names)
{
Console.WriteLine("name:{0}", item);
}
Console.ReadLine();
}
}
具体可参考 :https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield