Private Iterator Function EvenSequence(firstNumber As Integer, lastNumber As Integer) As IEnumerable(Of Integer) ' 回傳偶數 For number As Integer = firstNumber To lastNumber If number Mod 2 = 0 Then Yield number End If Next End Function
Iterator 我們前面提過,主要是要跟 compiler 說這是個要能列舉的函式,幫我實作 MoveNext、Current…等方法。那 Yield 呢?其實你在 Yeild 下【中斷點】去執行看看,就差不多知道結果了。
當程式執行到 Yield 陳述式時,便會儲存目前的位置,下一次呼叫 Iterator 時,便會從這個位置重新開始執行。
回想一下前面跑過的所有範例,我們每次跑 For ~ Each 迴圈,Yield 陳述式在做什麼事,記位置、回傳值,直到反覆運算(Iterator)動作結束(即 For ~ Each 每次取一個值,取完為止。)。記住這一次的位置,回傳這一位置的值,等下次再執行至 Yield 時,就跳至下一個位置,然後又是記住這一次的位置,回傳這一位置的值…重覆到結束。其實沒有那麼難懂。
雖然 C# 的使用者可能已經用到不想用了,但能在 Visual Basic 11 裡看到 Iterator 與 Yield 實在太高興了,也希望未來 C# / VB 之間能同步化。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。