这句话有什么用;“收益率”;C#中的关键字?

这句话有什么用;“收益率”;C#中的关键字?,c#,syntax,yield-return,C#,Syntax,Yield Return,可能重复: C#中的yield关键字有什么用途 我不明白这是从。。。有人能给我解释一下吗?我试着给你举个例子 下面是一种经典的方法,它填充列表对象,然后返回它: private IEnumerable<int> GetNumbers() { var list = new List<int>(); for (var i = 0; i < 10; i++) { list.Add(i); } return list

可能重复:

C#中的
yield
关键字有什么用途


我不明白这是从。。。有人能给我解释一下吗?

我试着给你举个例子

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

private IEnumerable<int> GetNumbers()
{
    var list = new List<int>();
    for (var i = 0; i < 10; i++)
    {
        list.Add(i);
    }
    return list;
}
如果不使用yield,您必须从0-10生成整个列表,然后返回该列表,然后迭代,直到找到数字5

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

我不知道我是否足够清楚

我的问题是,我什么时候使用它?有没有什么例子表明除了使用收益率之外别无选择?为什么有人觉得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;
    }
}
public static System.Collections.IEnumerable Power(整数、整数指数)
{
int计数器=0;
int结果=1;
while(计数器+++<指数)
{
结果=结果*编号;
收益结果;
}
}
在上面的示例中,yield语句在迭代器块中使用。调用幂方法时,它返回一个包含数字幂的可枚举对象。请注意,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);
    }
}
public static System.Collections.IEnumerable CountToTen()
{
int计数器=0;
while(计数器+++<10)
{
收益返回计数器;
}
}
公共静态Main(字符串[]…)
{
foreach(CountToTen()中的变量i)
{
控制台写入线(i);
}
}

So
yield
仅对
IEnumerable
s有用?因此
yield
仅对
IEnumerable
s有用?您只能在
IEnumerable
s上使用yield,所以yes@user1480525:但可以是任何可能类型的集合,因此您的“just for”不合适。
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;
    }
}
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);
    }
}