是“产量关键字”;在迭代器块之外有用
本文关键字:迭代器 有用 关键字 产量关键字 | 更新日期: 2023-09-27 18:15:50
yield
关键字文档说:
yield关键字向编译器发出信号,告诉它所使用的方法appear是一个迭代器块。
我遇到过在任何迭代器块之外使用yield
关键字的代码。这应该被认为是一个编程错误还是很好?
编辑抱歉忘记张贴我的代码:
int yield = previousVal/actualVal;
return yield; // Should this be allowed!!!???
谢谢。
在迭代器块之外使用yield
是ok的——这只是意味着它没有被用作上下文关键字。
// No idea whether this is financially correct, but imagine it is :)
decimal yield = amountReturned / amountInvested;
在这一点上,不是一个上下文关键字(绝不是一个"完整"关键字),它只是一个标识符。除非显然是在正常清晰度方面的最佳选择,否则我将尽量避免使用它,但有时可能是。
您只能将其用作yield return
和yield break
的上下文关键字,它们只在迭代器块中有效。(它们将方法变成迭代器。)
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 return
或yield break
中使用时,它是一个关键字并创建一个迭代器。
当在其他地方使用时,它是一个普通的标识符。
yield
对于比普通集合更有用;它也可以用来实现基本协同程序。