C#迭代器及Unity協(xié)程實(shí)例解析
1、C#迭代器
1.1、IEnumerable和IEnumerator
C#中的迭代器封裝在IEnumerable和IEnumerator和他們的泛型接口中。
IEnumerable:定義了一個(gè)可以獲取IEnumerator的方法---GetEnumerator()。
//IEnumerable的代碼實(shí)現(xiàn) public interface IEnumerable { IEnumerator GetEnumerator(); }
IEnumerator:則在目標(biāo)序列上實(shí)現(xiàn)循環(huán)迭代,直到不再需要數(shù)據(jù)。常見的foreach循環(huán)就是使用這個(gè)接口
//IEnumerator的代碼實(shí)現(xiàn) public interface IEnumerator { /// <summary> /// 獲取當(dāng)前的項(xiàng)(只讀屬性) /// </summary> object Current { get; } /// <summary> /// 將游標(biāo)的內(nèi)部位置向前移動(dòng) /// </summary> /// <returns>是否成功</returns> bool MoveNext(); /// <summary> /// 將游標(biāo)重置到第一個(gè)成員前面 /// </summary> void Reset(); }
但是為什么會(huì)有兩個(gè)接口呢?為什么不直接讓IEnumerable實(shí)現(xiàn)所有方法呢?
為了不違背單一職責(zé)原則。如果有幾個(gè)嵌套的foreach循環(huán),那么彼此就可能會(huì)收到影響了。
1.2、迭代器使用
C#中的數(shù)組和集合都是繼承了IEnumerable接口的,所以我們可以直接使用。
static void Main(string[] args) { int[] arr = new int[5] { 12, 65, 749, 16, 49 }; //foreach (int item in arr) //{ // Console.WriteLine(item); //} #region 和上面的foreach相同 IEnumerator e = arr.GetEnumerator(); //獲取要迭代的對(duì)象 while (e.MoveNext()) //一個(gè)一個(gè)的讀取元素,讀取完會(huì)返回false { Console.WriteLine(e.Current); //輸出讀取內(nèi)容 } #endregion }
自定義類中使用迭代器。
/// <summary> /// 動(dòng)物園類,里面有很多動(dòng)物 /// </summary> public class Zoo : IEnumerable { Animal[] animals = new Animal[3]; public Zoo() { animals[0] = new Animal("張三"); animals[1] = new Animal("李四"); animals[2] = new Animal("趙五"); } public IEnumerator GetEnumerator() { return this.animals.GetEnumerator(); } } /// <summary> /// 動(dòng)物類,每個(gè)動(dòng)物有其名字 /// </summary> public class Animal { private string name; public string Name { get { return name; } } public Animal(string name) { this.name = name; } } static void Main(string[] args) { Zoo zoo = new Zoo(); //可以直接使用foreach迭代 foreach (Animal animal in zoo) { Console.WriteLine(animal.Name); } Console.ReadKey(); }
2、Unity中的協(xié)程
2.1、進(jìn)程 線程 協(xié)程介紹
進(jìn)程:
- 進(jìn)程有自己獨(dú)立的堆和棧,既不共享堆,亦不共享?xiàng)#M(jìn)程由操作系統(tǒng)調(diào)度。
- 進(jìn)程是有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)。
線程:
- 線程有自己獨(dú)立的棧和共享的堆,共享堆,不共享?xiàng)!>€程由操作系統(tǒng)調(diào)度。
- 一個(gè)進(jìn)程可以包含多個(gè)線程。
- 線程異步運(yùn)行,多處理器中多個(gè)線程可同時(shí)運(yùn)行。
協(xié)程:
- 協(xié)程共享堆,不共享?xiàng)#瑓f(xié)程由程序員在協(xié)程的代碼里顯示調(diào)度。
- 協(xié)程執(zhí)行在游戲主線程上,同一時(shí)間只能執(zhí)行一個(gè)協(xié)程。
- 線程避免了無意義的調(diào)度,提高了性能,但需要程序員自己承擔(dān)調(diào)度責(zé)任。
2.2、協(xié)程使用
Unity的協(xié)程系統(tǒng)是基于C#的一個(gè)簡(jiǎn)單而強(qiáng)大的接口 ,IEnumerator。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用FileInfo和DirectoryInfo類來執(zhí)行文件和文件夾操作
System.IO.FileInfo?和?System.IO.DirectoryInfo?是C#中用于操作文件和文件夾的類,它們提供了許多有用的方法和屬性來管理文件和文件夾,這篇文章主要介紹了C#使用FileInfo和DirectoryInfo類來執(zhí)行文件和文件夾操作,需要的朋友可以參考下2023-08-08C#實(shí)現(xiàn)打印與打印預(yù)覽功能的思路及代碼
這篇文章主要介紹了C#實(shí)現(xiàn)打印與打印預(yù)覽功能的思路及代碼,有需要的朋友可以參考一下2013-12-12C#中Task.ContinueWith連續(xù)任務(wù)使用實(shí)例
本文主要介紹了C#中Task.ContinueWith連續(xù)任務(wù)使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02深入解析C#設(shè)計(jì)模式編程中對(duì)建造者模式的運(yùn)用
這篇文章主要介紹了C#設(shè)計(jì)模式編程中對(duì)建造者模式的運(yùn)用,文中還介紹了在.NET框架下建造者模式編寫思路的實(shí)現(xiàn),需要的朋友可以參考下2016-02-02c# 動(dòng)態(tài)構(gòu)建LINQ查詢表達(dá)式
這篇文章主要介紹了c# 如何動(dòng)態(tài)構(gòu)建LINQ查詢表達(dá)式,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下2020-11-11C#實(shí)現(xiàn)生成mac地址與IP地址注冊(cè)碼的兩種方法
這篇文章主要介紹了C#實(shí)現(xiàn)生成mac地址與IP地址注冊(cè)碼的兩種方法,非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09C#判斷數(shù)據(jù)類型的簡(jiǎn)單示例代碼
本篇文章要是對(duì)C#中判斷數(shù)據(jù)類型的簡(jiǎn)單示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01