Visual Basic 11 的 Iterator 與 Yield 心得筆記(5)

最後我們來了解整個 Iterator 與 Yield 執行流程。我們以心得(2)裡的範例來進行解釋。

    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 之間能同步化。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。