2011-11-25 46 views
9

yield關鍵字文檔說:「yield關鍵字」在迭代器塊外有用嗎?

收率關鍵字信號給編譯器的方法,其中,它 出現是迭代器塊。

我遇到了在任何迭代器塊外使用yield關鍵字的代碼。這應該被認爲是一個編程錯誤還是很好?

編輯對不起忘了張貼我的代碼:

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

感謝。

+7

**是**,它非常有用。 – dlev

+4

誰提出了「回報率」這條路線?是史詩比例的邪惡天才。 –

+0

我們有一些非常漂亮的代碼庫人!我問這個問題,因爲我反對這種編碼......我想聽聽社區對它的看法 – GETah

回答

22

這是沒關係使用yield迭代器塊之外 - 它只是意味着它沒有被用來作爲上下文關鍵字

例如:

// No idea whether this is financially correct, but imagine it is :) 
decimal yield = amountReturned/amountInvested; 

在這一點上它不是上下文關鍵字(這是從未「滿」的關鍵字),它只是一個標識符。除非它是明確在正常清晰度方面的最佳選擇,我會盡量避免使用它,但有時它可能會。

您只能將它用作yield returnyield break的上下文關鍵字,這些關鍵字僅在迭代器塊中才有效。 (他們是什麼把一個方法轉換爲迭代器。)

編輯:回答你的「這應該被允許」的問題......是的,它應該。否則,所有使用yield作爲標識符的現有C#1代碼將在C#2發佈時變得無效。應該小心地使用,而C#團隊確保它從來沒有實際含糊不清,但它是有意義的。

對於許多其他上下文關鍵字 - 「從」,「選擇」,「在哪裏」等,您是否想要阻止這些標識符?

+0

是的,這正是我的觀點 – GETah

+1

@GETah:好的,在你給出的上下文中,它並不是一個真正的*關鍵詞* ... –

+0

喬恩,只是在這裏測試我的理解......是否方法,例如[我的答案](http://stackoverflow.com/q/8273864/593627)中的'GetNotVeryRandomNumbers'不在迭代器塊中? (我認爲'yield'創造了一個,但不一定存在於其中)。這似乎與你最後的聲明相矛盾。 –

5

yield上下文關鍵字
當在yield returnyield break中使用時,它是一個關鍵字並創建一個迭代器。
在其他地方使用時,它是一個正常的標識符。

yield對於more than ordinary collections可能非常有用;它也可以用來實現原始協程。

+0

+1鏈接到您先前有趣的問題 – phoog

11

這就是說,如果在方法中使用yield,該方法將成爲迭代器塊。

此外,因爲yieldcontextual 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

+0

我可能是錯的,但我認爲這錯過了問題的重點。問題不是「迭代器塊有用嗎?」 - 而是:當在一個迭代器塊之外使用***時,「yield」是否有用? –

+0

在GetNotVeryRandomNumbers方法中,它不在迭代器塊中(它創建一個),還是我誤解了迭代器塊? –

+0

隨着編輯,很明顯,我絕對沒有錯過這個問題的重點! (oops) –