是“产量关键字”;在迭代器块之外有用

本文关键字:迭代器 有用 关键字 产量关键字 | 更新日期: 2023-09-27 18:15:50

yield关键字文档说:

yield关键字向编译器发出信号,告诉它所使用的方法appear是一个迭代器块。

我遇到过在任何迭代器块之外使用yield关键字的代码。这应该被认为是一个编程错误还是很好?

编辑抱歉忘记张贴我的代码:

int yield = previousVal/actualVal;
return yield; // Should this be allowed!!!???

谢谢。

是“产量关键字”;在迭代器块之外有用

在迭代器块之外使用yieldok的——这只是意味着它没有被用作上下文关键字

例如:

// No idea whether this is financially correct, but imagine it is :)
decimal yield = amountReturned / amountInvested;
在这一点上,不是一个上下文关键字(绝不是一个"完整"关键字),它只是一个标识符。除非显然是在正常清晰度方面的最佳选择,否则我将尽量避免使用它,但有时可能是。

您只能将其用作yield returnyield break的上下文关键字,它们只在迭代器块中有效。(它们将方法变成迭代器。)

编辑:为了回答你的"这应该被允许吗"的问题…是的,应该是这样。否则,当c# 2发布时,所有使用yield作为标识符的现有c# 1代码都将失效。应该小心使用, c#团队已经确保它永远不会有歧义,但它是有效的。

同样适用于许多其他上下文关键字-"from","select","where"等。你想阻止它们成为标识符吗?

这就是说,如果你在一个方法中使用yield,这个方法就变成了一个迭代器块。

另外,由于yield是一个上下文关键字,它可以自由地在其他地方使用,而完整的关键字不能(例如变量名)。

void AnotherMethod()
{
    foreach(var NotRandomNumber in GetNotVeryRandomNumbers())
    {
        Console.WriteLine("This is not random! {0}", NotRandomNumber);
    }
}
IEnumerable<int> GetNotVeryRandomNumbers()
{
    yield return 1;
    yield return 53;
    yield return 79;
    yield return 1;
    yield return 789;
}
// Perhaps more useful function below: (untested but you get the idea)
IEnumerable<Node> DepthFirstIteration(Node)
{
    foreach(var Child in Node.Children)
    {
        foreach(var FurtherChildren in DepthFirstIteration(Child))
        {
            yield return FurtherChildren;
        }
    }
    yield return Node;
}

参见:这个答案,它显示了一个接一个地使用yield。迭代器块的巧妙使用

yield上下文关键字
当在yield returnyield break中使用时,它是一个关键字并创建一个迭代器。
当在其他地方使用时,它是一个普通的标识符。

yield对于比普通集合更有用;它也可以用来实现基本协同程序。