的yield
關鍵字文檔說:「yield關鍵字」在迭代器塊外有用嗎?
收率關鍵字信號給編譯器的方法,其中,它 出現是迭代器塊。
我遇到了在任何迭代器塊外使用yield
關鍵字的代碼。這應該被認爲是一個編程錯誤還是很好?
編輯對不起忘了張貼我的代碼:
int yield = previousVal/actualVal;
return yield; // Should this be allowed!!!???
感謝。
的yield
關鍵字文檔說:「yield關鍵字」在迭代器塊外有用嗎?
收率關鍵字信號給編譯器的方法,其中,它 出現是迭代器塊。
我遇到了在任何迭代器塊外使用yield
關鍵字的代碼。這應該被認爲是一個編程錯誤還是很好?
編輯對不起忘了張貼我的代碼:
int yield = previousVal/actualVal;
return yield; // Should this be allowed!!!???
感謝。
這是沒關係使用yield
迭代器塊之外 - 它只是意味着它沒有被用來作爲上下文關鍵字。
例如:
// No idea whether this is financially correct, but imagine it is :)
decimal yield = amountReturned/amountInvested;
在這一點上它不是上下文關鍵字(這是從未「滿」的關鍵字),它只是一個標識符。除非它是明確在正常清晰度方面的最佳選擇,我會盡量避免使用它,但有時它可能會。
您只能將它用作yield return
和yield break
的上下文關鍵字,這些關鍵字僅在迭代器塊中才有效。 (他們是什麼把一個方法轉換爲迭代器。)
編輯:回答你的「這應該被允許」的問題......是的,它應該。否則,所有使用yield
作爲標識符的現有C#1代碼將在C#2發佈時變得無效。應該小心地使用,而C#團隊確保它從來沒有實際含糊不清,但它是有意義的。
對於許多其他上下文關鍵字 - 「從」,「選擇」,「在哪裏」等,您是否想要阻止這些標識符?
是的,這正是我的觀點 – GETah
@GETah:好的,在你給出的上下文中,它並不是一個真正的*關鍵詞* ... –
喬恩,只是在這裏測試我的理解......是否方法,例如[我的答案](http://stackoverflow.com/q/8273864/593627)中的'GetNotVeryRandomNumbers'不在迭代器塊中? (我認爲'yield'創造了一個,但不一定存在於其中)。這似乎與你最後的聲明相矛盾。 –
yield
是上下文關鍵字。
當在yield return
或yield break
中使用時,它是一個關鍵字並創建一個迭代器。
在其他地方使用時,它是一個正常的標識符。
yield
對於more than ordinary collections可能非常有用;它也可以用來實現原始協程。
+1鏈接到您先前有趣的問題 – phoog
這就是說,如果在方法中使用yield
,該方法將成爲迭代器塊。
此外,因爲yield
是contextual keyword它可以自由地在其他地方使用,其中完整的關鍵字不能(例如變量名稱)。
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;
}
參見:這樣的回答,這表明使用了一個又一個的產量。 Clever Uses of Iterator Blocks
我可能是錯的,但我認爲這錯過了問題的重點。問題不是「迭代器塊有用嗎?」 - 而是:當在一個迭代器塊之外使用***時,「yield」是否有用? –
在GetNotVeryRandomNumbers方法中,它不在迭代器塊中(它創建一個),還是我誤解了迭代器塊? –
隨着編輯,很明顯,我絕對沒有錯過這個問題的重點! (oops) –
**是**,它非常有用。 – dlev
誰提出了「回報率」這條路線?是史詩比例的邪惡天才。 –
我們有一些非常漂亮的代碼庫人!我問這個問題,因爲我反對這種編碼......我想聽聽社區對它的看法 – GETah