关于语法:C#中“yield”关键字的用途是什么?

What is the use of the “yield” keyword in C#?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Proper Use of yield return

在C中,yield关键字的用法是什么?

我没有从MSDN参考资料中理解它…有人能给我解释一下吗?


我想给你举个例子

下面是经典的方法,它填充一个列表对象,然后返回它:

1
2
3
4
5
6
7
8
9
private IEnumerable<int> GetNumbers()
{
    var list = new List<int>();
    for (var i = 0; i < 10; i++)
    {
        list.Add(i);
    }
    return list;
}

yield关键字逐个返回如下项:

1
2
3
4
5
6
7
private IEnumerable<int> GetNumbers()
{
    for (var i = 0; i < 10; i++)
    {
        yield return i;
    }
}

所以假设调用getNumbers函数的代码如下:

1
2
3
4
5
6
7
8
foreach (int number in GetNumbers())
{
   if (number == 5)
   {
       //do something special...
       break;
   }
}

如果不使用yield,则必须从0-10生成整个列表,然后返回该列表,然后迭代,直到找到数字5。

现在,多亏了yield关键字,您将只生成数字,直到您到达您要查找的那个,并打破循环。

我不知道我是否足够清楚……


my question is, when do I use it? Is there any example out there where I have there is no other choice but using yield? Why did someone feel C# needed another keyword?

您链接的文章提供了一个很好的示例,说明何时以及如何使用它。

我也不喜欢引用你自己链接的文章,但是如果文章太长,你就没有读过。

yield关键字向编译器发出信号,表示它出现的方法是迭代器块。编译器生成一个类来实现迭代器块中表示的行为。

1
2
3
4
5
6
7
8
9
10
public static System.Collections.IEnumerable Power(int number, int exponent)
{
    int counter = 0;
    int result = 1;
    while (counter++ < exponent)
    {
        result = result * number;
        yield return result;
    }
}

在上面的示例中,yield语句在迭代器块内使用。当调用power方法时,它返回一个包含数字幂的可枚举对象。请注意,power方法的返回类型是System.Collections.IEnumerable,它是迭代器接口类型。

因此编译器会根据方法执行期间生成的内容自动生成一个IEnumerable接口。

为了完整起见,下面是一个简化的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static System.Collections.IEnumerable CountToTen()
{
    int counter = 0;
    while (counter++ < 10)
    {
        yield return counter;
    }
}

public static Main(string[]...)
{
    foreach(var i in CountToTen())
    {
        Console.WriteLine(i);
    }
}