從foreach 到yield 來聊聊協程

2021-08-21 09:36:50 字數 2355 閱讀 5846

c#實現foreach  其實是通過對乙個集合不斷的迭代輸出的過程 。  它需要滿足的條件是

1 foreach的物件有 getenumarator方法 來返回迭代物件的集合

2 需要有乙個類繼承ienumerator介面。該類有乙個集合儲存了所有需要迭代的物件,並且該類中必須有幾個方法:返回乙個是否還有需要迭代的物件的bool movenext()方法,重新設定迭代索引的 reset()方法,還有返回當前迭代物件的ienumerator方法。以list的底層實現為例子

下面我們自己實現乙個功能來鞏固一下:

public class iteratortarget 

public string firstname;

public string lastname;

public class foreachobject

}public iteratorobject getenumerator()

// when you implement ienumerable, you must also implement ienumerator.

public class iteratorobject : ienumerator

public bool movenext()

public void reset()

object ienumerator.current

}public iteratortarget current

catch (indexoutofrangeexception)}}

上面我們定義了三個類乙個迭代的物件iteratortarget ,乙個 foreach的物件 foreachobject 最後乙個 用來繼承ienumerator的類iteratorobject。下面

static void main(string args)

;foreachobject foreachobject= new foreachobject(iteratortargetarray);

foreach (iteratortarget p in foreachobject)

console.writeline(p.firstname + " " + p.lastname);

console.read();

輸出了john smith

jim johnson

sue rabon

自定義的foreach輸出成功!!!

下面該聊聊yield了 先上乙個用 yield實現同上面一樣功能

public class test

;public ienumeratorgetenumerator()

}main方法變成

static void main(string args)

console.read();

}同樣輸出了

john smith

jim johnson

sue rabon

到這裡我們應該明白了,其實yield就相當於為我們省去了 建立上面第二個條件的繼承自ienumarator的類。yield的作用就是不斷的執行 movenetxt(). getcurrent() 等方法來一步步迭代,其實上面的test類我們還可以這樣寫

public class test

了解了 yield的具體用法後也就不難理解unity 中協程的作用了,當unity開始一段協程時候,startcroutine(somefunc) somefunc是乙個返回值為ienumarator的方法。當迭代器方法執行到 yield return 語句時,會返回乙個expression表示式並保留當前在**中的位置。 當下次呼叫迭代器函式時執行從該位置重新啟動。

unity在每幀的update之後執行協程,做的工作就是:呼叫 協程(迭代器)movenext() 方法,如果返回 true ,就從當前位置繼續往下執行從而每幀迭代下去。(插播 unity獲得wake start update 協程等方法時候是通過在編譯階段可以是ilcpp或者mono把updae wake 等方法放到不同的list裡面然後再執行的時候依次執行,而不是通過執行時候反射拿到 。具體如下

當第一次訪問給定型別的單行為時,將通過指令碼執行時(mono或il2cpp)檢查底層指令碼是否定義了任何神奇的方法(指的是wake update 等方法),並快取這些資訊。如果乙個單值行為有乙個特定的方法,它將被新增到乙個適當的列表中,例如,如果乙個指令碼定義了更新方法,那麼它將被新增到乙個指令碼列表中,這些指令碼需要在每一幀中進行更新。在遊戲中,unity只是遍歷這些列表並執行它的方法)

另外加上我實現的 unity中的協程的 yield return null 功能 。

位址reference:  

從python的yield說起

感覺是在需要返回某個值的地方通過yield來代替return,不是很明白其用法,所以仔細研究下。乙個使用了yiled關鍵字的函式就不再是乙個普通的函式了,而是乙個生成器函式 generator function 當函式被呼叫的時候將返回乙個迭代器 iterator 所以下面將分別講解迭代器和生成器這...

用foreach來遍歷陣列

我們定義乙個陣列,可以用foreach來遍歷該陣列所有的內容並輸出。arr array a dog b monkey c pen foreach arr as val 但是在實際開發中,我們往往不這麼用,因為要按格式化陣列檢索結果,一般結合html的 處理,用while或者for迴圈。基本上是關聯陣...

在 PHP 中使用 yield 來做記憶體優化

你有沒有想過 在php中使用 yield 會有什麼益處 我將為你節省一些谷歌搜尋的時間 我列出了一些要向你介紹的要點來全面認知 yield 什麼是 yield。yield return 的區別。yield 有什麼選項。結論。參考。1.什麼是 yield 生成器函式看上去就像乙個普通函式,除了不是返回...