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 生成器函式看上去就像乙個普通函式,除了不是返回...