2

可能重复:
正确使用收益回报

yieldC#中关键字的用途是什么?

我从MSDN 参考资料中无法理解...有人可以向我解释一下吗?

4

2 回答 2

8

我会试着给你一个例子

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

private IEnumerable<int> GetNumbers()
{
    var list = new List<int>();
    for (var i = 0; i < 10; i++)
    {
        list.Add(i);
    }
    return list;
}

yield 关键字像这样一一返回项目:

private IEnumerable<int> GetNumbers()
{
    for (var i = 0; i < 10; i++)
    {
        yield return i;
    }
}

所以想象一下调用 GetNumbers 函数的代码如下:

foreach (int number in GetNumbers())
{
   if (number == 5)
   {
       //do something special...
       break;
   }
}

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

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

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

于 2012-06-29T23:36:16.253 回答
0

我的问题是,我什么时候使用它?有没有什么例子让我别无选择,只能使用产量?为什么有人觉得 C# 需要另一个关键字?

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

我讨厌引用你自己也链接的一篇文章,但它太长了,你没有读过。

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

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 接口。

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

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);
    }
}
于 2012-06-29T23:36:46.080 回答