精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解 C# 的 foreach 工作原理

原創(chuàng)
開發(fā) 后端
作為開發(fā)人員我們經(jīng)常會在程序中編寫 foreach 語句實現(xiàn)對類型的遍歷,但是并不是所有的類型都可以遍歷,這個知識點是絕大部分開發(fā)成員所知曉的。但是類型可以被 foreach 遍歷的依據(jù)是什么部分程序員并不清楚,下面我就通過舉例的方式來具體講解 foreach 原理。

[[346581]]

【51CTO.com原創(chuàng)稿件】作為開發(fā)人員我們經(jīng)常會在程序中編寫 foreach 語句實現(xiàn)對類型的遍歷,但是并不是所有的類型都可以遍歷,這個知識點是絕大部分開發(fā)成員所知曉的。但是類型可以被 foreach 遍歷的依據(jù)是什么部分程序員并不清楚,下面我就通過舉例的方式來具體講解 foreach 原理。

在這里我們首先自定義一個類型 Cat 并遍歷這個類型:

  1. //定義 Cat 類型 
  2. class Cat 
  3. //遍歷 Cat 
  4. class Program 
  5.    static void Main(string[] args) 
  6.   { 
  7.        Cat cat = new Cat(); 
  8.        foreach(var item in cat) 
  9.       { 
  10.            //more code 
  11.       } 
  12.   } 

我們運行上述代碼后編譯器會提示錯誤 “Cat” 不包含 “GetEnumerator” 的公共定義,因此 foreach 語句不能作用于 “Cat” 類型的變量,由此錯誤提示我們可以得知如果 Cat 類型可以被 foreach 遍歷,那么 Cat 類就必須實現(xiàn) GetEnumerator 方法。下面我們就在 Cat 類中加入 GetEnumerator 方法。

  1. class Cat 
  2.    //加入 GetEnumerator 方法的實現(xiàn) 
  3.    public object GetEnumerator() 
  4.   { 
  5.        return null
  6.   } 

我們再次運行代碼,這時程序出現(xiàn)如下兩個錯誤提示:

  • foreach 要求 “Cat.GetEnumerator()”的返回類型 “object”必須具有適當?shù)墓?MoveNext 方法和公共 Current 屬性;

  • object 并不包含 “MoveNext” 的定義。

根據(jù)上述錯誤提示我們可以推斷出 GetEnumerator 方法的返回值必須要有 MoveNext 方法和 Current 屬性。但是我們目前并不知道 GetEnumerator 方法的返回值類型和 Current 屬性是否是只讀的,這種情況我們該怎么辦呢?此時我們可以查看已經(jīng)支持 foreach 遍歷的類型是怎么做的,下面的代碼段展示了 string 類型是如何實現(xiàn)的(只列出了關鍵代碼)。

  1. //more code 
  2. public CharEnumerator GetEnumerator(); 
  3. //more code 
  4. pubic sealed class CharEnumerator:ICloneabe,IEnumerator<char>,IEnumerator,IDisposable 
  5.    public char Current {get;} 
  6.    //more code 
  7.    public bool MoveNext(); 
  8.    //more code 

根據(jù)上述代碼段我們仿寫如下:

  1. class Cat 
  2.    public CatEnumerator GetEnumerator() 
  3.   { 
  4.        return new CatEnumerator(); 
  5.   } 
  6. class CatEnumerator 
  7.    public char Current {get;} 
  8.    public bool MoveNext() 
  9.   { 
  10.        return true
  11.   } 

這時我們編譯發(fā)現(xiàn)原來的錯誤已經(jīng)消失了,程序編譯通過了。但是不要以為到這里就完了,Cat 類僅僅包含這些是沒有任何意義的,這些內(nèi)容只是為了讓程序通過編譯而已,在實際開發(fā)中我們遍歷的對象是一個序列,那么我們現(xiàn)在就在 Cat 類中添加一個固定的序列:

  1. class Cat 
  2.    string[] datas=new string[]{"波斯貓","貍花貓","無毛貓","虎斑貓"}; 
  3.    public CatEnumerator GetEnumerator() 
  4.   { 
  5.        return new CatEnumerator(); 
  6.   } 

我們已經(jīng)添加了數(shù)據(jù)對象,那么 foreach 是如何訪問到這個數(shù)據(jù)的呢?這時我們可以將數(shù)據(jù)對象通過 GetEnumerator 方法作為迭代計數(shù)器對象(CatEnumerator)構造函數(shù)的參數(shù)傳遞進去,然后迭代計數(shù)器對象提供一個屬性將這些數(shù)據(jù)存儲起來。

  1. class Cat 
  2.    string[] datas=new string[]{"波斯貓","貍花貓","無毛貓","虎斑貓"}; 
  3.    public CatEnumerator GetEnumerator() 
  4.   { 
  5.        return new CatEnumerator(datas); 
  6.   } 
  7. class CatEnumerator 
  8.    //存儲數(shù)據(jù) 
  9.    private string[] datas; 
  10.    //帶參構造函數(shù) 
  11.    public CatEnumerator(string[] datas) 
  12.   { 
  13.        this.datas=datas; 
  14.   } 
  15.    public char Current {get;} 
  16.    public bool MoveNext() 
  17.   { 
  18.        return true
  19.   } 

到目前為止我們已經(jīng)設置了遍歷的數(shù)據(jù),如果要將數(shù)據(jù)遍歷出來還需要一個下標索引來讀取數(shù)組中的每個元素,并將每次讀取出來的元素值賦值給 Current 屬性。我們可以在迭代計數(shù)器對象中定義一個 index 整型私有屬性作為下標索引屬性,這里需要注意的是我們 index 這個屬性的默認值為 -1 ,這一點是很多新手開發(fā)人員比較容易出錯的地方。既然有下標了,我們在遍歷的時候下標就必須是遞增變化,不斷指向下一個元素的位置直到到達數(shù)組的末端為止。這時我們就需要在 MoveNext 方法中進行執(zhí)行下標遞增的操作了,MoveNext 方法是一個返回值為 bool 類型的方法,其目的是告知 foreach 當前遍歷的數(shù)據(jù)對象是否存在還未遍歷到的元素,如果存在就返回 true 反之返回 false 遍歷結束。下面我們針對這一段所說的內(nèi)容進行代碼編寫。

  1. class CatEnumerator 
  2.    //存儲數(shù)據(jù) 
  3.    private string[] datas; 
  4.    //帶參構造函數(shù) 
  5.    public CatEnumerator(string[] datas) 
  6.   { 
  7.        this.datas=datas; 
  8.   } 
  9.    //數(shù)組下標 
  10.    private int index=-1; 
  11.    //遍歷當前元素 
  12.    public char Current  
  13.   { 
  14.        get 
  15.       { 
  16.            return datas[index]; 
  17.       } 
  18.   } 
  19.    public bool MoveNext() 
  20.   { 
  21.        index++; 
  22.        return index < datas.Length; 
  23.        return true
  24.   } 

到目前為止我們就編寫了一個可以通過 foreach 遍歷的類型,這里有三點很重要:

  • GetEnumerator 方法的作用是 foreach 調(diào)用當前需要遍歷的類型的迭代計數(shù)器對象,該方法的返回類型為用于foreach 遍歷的迭代計數(shù)器對象;

  • Current 屬性就是當前遍歷到的對象;

  • MoveNext 方法促使迭代計數(shù)器對象的計數(shù)移動到下一位。

通過前面所述的內(nèi)容,我們可知 foreach 遍歷主要有三個步驟:

  • foreach 調(diào)用當前可遍歷類型的 GetEnumerator 方法創(chuàng)建一個迭代計數(shù)器對象,并將要遍歷的數(shù)據(jù)傳遞給迭代計數(shù)器對象的構造函數(shù)中;

  • 迭代計數(shù)器對象調(diào)用它 MoveNext 方法將所以小標遞增 1 ,若下標大于數(shù)據(jù)長度則迭代完成;

  • MoveNext 方法返回 true 并返回 Current 屬性中存儲的數(shù)據(jù)。

以上三個步驟總結起來就是 獲取迭代計數(shù)器對象 >> 調(diào)用 MoveNext 方法 >> 獲取 Current 屬性。

小技巧:在 c# 中如果要查看某個類型是否支持 foreach 我們可以查看該類型和該類型的迭代計數(shù)器是否都實現(xiàn)了 IEnumerable 接口,因為 IEnumerable 接口中的就包含了 foreach 實現(xiàn)的原理和必須調(diào)用的成員。

作者簡介

朱鋼,筆名喵叔,國內(nèi)某技術博客認證專家,.NET高級開發(fā)工程師,7年一線開發(fā)經(jīng)驗,參與過電子政務系統(tǒng)和AI客服系統(tǒng)的開發(fā),以及互聯(lián)網(wǎng)招聘網(wǎng)站的架構設計,目前就職于一家初創(chuàng)公司,從事企業(yè)級安全監(jiān)控系統(tǒng)的開發(fā)。

【51CTO原創(chuàng)稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:龐桂玉 來源: 51CTO
相關推薦

2009-07-31 18:39:31

C#中foreach引

2009-08-28 17:18:55

foreach循環(huán)

2011-03-11 09:41:17

JavaGC

2009-01-19 10:26:02

C#Namespace.NET

2009-08-31 16:47:39

C#接口的定義

2025-05-08 08:10:53

2009-08-14 17:09:48

C#引用類型

2009-09-03 17:40:25

C#發(fā)送短信

2009-08-24 11:23:41

C# TimeLabe

2009-09-07 16:13:56

C# MessageB

2009-09-01 16:07:04

C#命名規(guī)約

2009-07-30 18:20:21

C#繼承

2009-09-17 16:34:24

C#組件類

2009-09-16 13:05:32

C#組件開發(fā)

2009-08-26 15:25:06

.NET Framew

2009-08-25 17:43:17

C#串口監(jiān)聽

2009-09-02 19:12:37

C#遞歸

2009-09-02 11:02:57

C#動態(tài)數(shù)組

2009-08-13 14:46:03

C#結構體定義

2010-06-18 15:49:41

ACPId服務
點贊
收藏

51CTO技術棧公眾號

国产午夜免费视频| 中文字幕无人区二| 二区三区在线观看| 丁香六月综合激情| 啪一啪鲁一鲁2019在线视频| 免费在线观看a视频| 欧美日韩黄色| 日本韩国欧美国产| 国产91在线亚洲| 国产综合视频一区二区三区免费| 精品一区二区三区久久| 午夜影院久久久| 日韩av高清在线播放| 国产www免费观看| 日韩成人一区二区| 国内精品一区二区三区| 无码人中文字幕| 日韩三区视频| 日韩精品一区二区在线| 亚洲综合色在线观看| 老牛影视精品| 又紧又大又爽精品一区二区| 亚洲日本理论电影| 九色蝌蚪在线| 99久久99精品久久久久久| 91免费视频网站| 一区二区视频免费观看| 美女精品在线| 77777少妇光屁股久久一区| 五月天丁香激情| 99久久www免费| 一本色道久久88精品综合| 亚洲最大免费视频| 国产 日韩 欧美 综合 一区| 日韩一区和二区| 91丝袜超薄交口足| 欧美伊人亚洲伊人色综合动图| 色婷婷香蕉在线一区二区| 无码专区aaaaaa免费视频| 羞羞污视频在线观看| 亚洲欧美在线aaa| 亚洲一区二区三区精品动漫| 搞黄视频在线观看| 日本一区二区免费在线观看视频| 欧洲久久久久久| 可以在线观看的av网站| 久久夜色精品国产欧美乱极品| 国产一区二区三区免费不卡| 亚洲AV无码一区二区三区少妇| 国产一区二区三区四| 91精品视频在线| 国产精品伦理一区| 国产一区二区三区久久悠悠色av| 成人网中文字幕| 国产男男gay体育生网站| 精品一区免费av| 成人黄色av播放免费| 国产乱码精品一区二区| 国产精品123| 91九色蝌蚪嫩草| 亚洲欧美激情国产综合久久久| 国产1区2区3区精品美女| 国产精品10p综合二区| 黑人精品一区二区三区| av不卡一区二区三区| 极品校花啪啪激情久久| 久久电影中文字幕| 国产精品免费丝袜| 992tv成人免费观看| 日本片在线看| 黑人巨大精品欧美一区二区免费| 久久综合给合久久狠狠色| 欧美一区二区视频| 国产亚洲精品超碰| 美国av在线播放| 97人人爽人人澡人人精品| 色婷婷av久久久久久久| 日本人视频jizz页码69| 激情综合婷婷| 日韩高清免费观看| 欧美激情 一区| 国产一区欧美| 欧美亚洲一区在线| 国产精品久久久久久久一区二区| 国产成人免费高清| 欧美精品人人做人人爱视频| 日本视频在线免费观看| 久久精品女人毛片国产| 国产精品观看| 欧美一级黄色网| 国产精品无码粉嫩小泬| 国产精品久久久久久影院8一贰佰| 三级精品视频久久久久| wwwav国产| 亚洲综合日本| 成人午夜一级二级三级| 蜜桃视频在线观看www| 国内精品久久久久国产盗摄免费观看完整版| 欧美另类69精品久久久久9999| 日韩精品久久久久久久酒店| 日本网站在线观看一区二区三区| 成人免费淫片aa视频免费| 国模人体一区二区| 中日韩av电影| 欧美激情 国产精品| 欧美黄页免费| 日韩精品免费视频| 欧美色图一区二区| 日韩成人av影视| 国产青春久久久国产毛片| 在线激情网站| 欧美午夜性色大片在线观看| 国内av免费观看| 中文字幕人成人乱码| 日韩女同互慰一区二区| 中文字幕免费高清视频| 国产精品99一区二区三区| 97激碰免费视频| 国产精品国产av| 91色|porny| 91亚洲精品国产| 欧美亚洲福利| 亚洲深夜福利视频| 精品午夜福利视频| 国产精品一卡二卡在线观看| 欧美一区二区三区在线免费观看| 久久久久久久久免费视频| 色婷婷一区二区| 国产成人无码一区二区在线观看| 欧美私人啪啪vps| 亚洲男人天天操| 日韩精品成人在线| 国产成人精品免费| 7777在线视频| 中文成人在线| 中文字幕色婷婷在线视频| av一区二区三区黑人| 一区二区三区欧美在线| abab456成人免费网址| 日韩电影中文字幕| 久热这里有精品| 狠狠v欧美v日韩v亚洲ⅴ| 日韩午夜在线播放| 这里只有久久精品| 99热这里只有精品8| 国产精品一区二区在线观看| 在线欧美三级| 欧美一区二区三区免费视频| 五月婷婷六月香| 日本在线不卡一区| 五月天亚洲综合小说网| 成人在线免费| www.欧美精品一二三区| 国产露脸国语对白在线| 亚洲精品国产成人久久av盗摄| 97超碰免费在线观看| 欧美精品成人| 精品一区二区三区日本| 免费观看成人性生生活片| 在线播放国产一区二区三区| 成人黄色免费网| 中文字幕一区二区三区四区 | 日本精品专区| 欧美日韩综合视频| 免费视频91蜜桃| 九九久久精品视频 | 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品入口免费| 2022成人影院| 中文字幕精品国产| av中文字幕免费| 亚洲h动漫在线| 熟女高潮一区二区三区| 久久97超碰国产精品超碰| 99亚洲国产精品| 久久99精品国产自在现线| 国产成人在线一区二区| 免费a级毛片在线播放| 精品国精品国产尤物美女| 亚洲精品77777| 国产欧美日韩不卡| 丰满少妇中文字幕| 亚洲一区二区三区免费在线观看| 日韩福利一区二区三区| 日本一区二区三区视频在线看| 4p变态网欧美系列| 欧美69xxxx| 日韩经典中文字幕在线观看| 中日韩在线观看视频| 一区二区三区在线视频免费 | 26uuu国产精品视频| 1024国产在线| 亚洲成人动漫在线播放| 中文字幕在线播放不卡| 亚洲r级在线视频| 一区二区三区影视| 91免费看视频| 永久免费看片在线观看| 天使萌一区二区三区免费观看| 中国黄色录像片| 怕怕欧美视频免费大全| 不卡视频一区| 999色成人| 国产成人精品日本亚洲专区61| 午夜影院免费在线| 在线观看视频亚洲| 先锋av资源站| 日韩免费高清视频| 亚洲综合精品国产一区二区三区| 精品国产91久久久| 麻豆视频在线观看| 国产精品狼人久久影院观看方式| 少妇户外露出[11p]| 国产精品资源在线| 91国内在线播放| 日韩成人免费电影| 99色精品视频| 伊人影院久久| 高清无码一区二区在线观看吞精| 成人在线免费小视频| 97在线中文字幕| 欧美成人黑人| 欧美最顶级丰满的aⅴ艳星| 人人超在线公开视频| 久久久999国产| 日韩激情一区二区三区| 国产精品女主播在线观看| 亚洲激情视频小说| 99久精品国产| 熟妇人妻久久中文字幕| 国产成人午夜精品5599| 自拍偷拍21p| 日韩精品乱码av一区二区| 欧美精品久久久久久久久久久| 亚洲综合色网| 9999在线观看| 亚洲最大黄网| 精品国产一区二区三区在线| 亚洲精品国产首次亮相| 在线视频不卡一区二区| 911久久香蕉国产线看观看| 在线电影看在线一区二区三区| 成人在线免费小视频| 亚洲第一导航| 99国产精品免费视频观看| 伊人久久av导航| 国产精品97| 特级黄色录像片| 亚洲人metart人体| 免费极品av一视觉盛宴| 亚洲国产mv| 欧美爱爱视频免费看| 亚洲自啪免费| 九一精品在线观看| 深夜福利在线看| 欧美一级黄色录像| 国产成人av免费看| 精品剧情v国产在线观看在线| www.中文字幕| 亚洲第一天堂无码专区| 香蕉av在线播放| 亚洲香蕉成人av网站在线观看| 国产在线日本| 神马久久桃色视频| 在线不卡日本v二区707| 国内精品久久久久久| 亚洲天堂电影| 国产精品欧美亚洲777777 | 国产中文字幕日韩| 精品国产麻豆| 国产中文一区二区| 自拍自偷一区二区三区| 西游记1978| 久久久久久久久久久9不雅视频| a级片一区二区| 亚洲精品人人| 91女神在线观看| 国产福利视频一区二区三区| www.男人天堂| 国产精品美女久久久久久久久| 日本妇女毛茸茸| 亚洲成av人在线观看| 精品无码一区二区三区的天堂| 91精品国产91久久综合桃花 | 日韩在线资源网| 人人超在线公开视频| 国产999精品久久久| 国产美女视频一区二区| 久久精品丝袜高跟鞋| 日韩情爱电影在线观看| 人妻夜夜添夜夜无码av| 美腿丝袜亚洲综合| 中文在线永久免费观看| 综合久久久久久| 91丝袜一区二区三区| 欧美一级黄色片| 国产1区2区3区在线| 久久久久久18| 欧美一级网址| 久久综合一区| 自产国语精品视频| 999在线免费视频| 不卡视频免费播放| 日韩国产第一页| 91久久精品国产91性色tv| 性生活视频软件| 日韩一区二区av| 永久免费毛片在线播放| 97久久人人超碰caoprom欧美| 国产一区二区区别| 99热自拍偷拍| 国产馆精品极品| www.4hu95.com四虎| 欧美天天综合色影久久精品| www.日日夜夜| 日韩综合中文字幕| 日韩三区免费| 裸模一区二区三区免费| 亚洲欧洲午夜| 欧美色图校园春色| 日韩美女视频19| 在线观看毛片视频| 在线免费看av不卡| 女生影院久久| 久久综合久久久| 亚洲深夜av| 久久精品女同亚洲女同13| 一个色综合av| 国产高清免费av| 草民午夜欧美限制a级福利片| 国产精品亚洲d| 涩涩涩999| 三级精品在线观看| 在线不卡av电影| 一本色道久久综合亚洲91| 日本成人一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| jazzjazz国产精品久久| 激情五月婷婷六月| 国产91在线看| 国产精品50页| 精品精品欲导航| 岛国av在线网站| 国产一区国产精品| 宅男噜噜噜66国产日韩在线观看| 国产精品手机在线观看| 亚洲动漫第一页| 亚洲av成人无码久久精品老人 | 中文字幕欧美精品在线| 日韩不卡视频在线观看| 手机成人在线| 久久爱另类一区二区小说| 91视频青青草| 日韩三级电影网址| av岛国在线| 蜜桃麻豆91| 蜜桃免费网站一区二区三区| 极品色av影院| 日韩三级高清在线| 狠狠操一区二区三区| 欧美一区二区三区电影在线观看| 日本伊人色综合网| 蜜桃av.com| 欧美成人一区二区三区在线观看| 丁香花在线电影| 蜜桃传媒视频麻豆一区| 麻豆中文一区二区| 欧美日韩精品在线观看视频| 亚洲高清av在线| 日韩欧美少妇| 青草全福视在线| 99久免费精品视频在线观看| 亚洲免费黄色网址| 丝袜美腿亚洲一区二区| 欧美日韩黄网站| 国产1区2区在线| 亚洲色图制服丝袜| 日本黄色大片视频| 国产精品久久久久7777婷婷| 一区二区三区国产精华| 99re久久精品国产| 欧美日韩一区二区三区四区| 好操啊在线观看免费视频| 国产一区福利视频| 久久www免费人成看片高清| 国产真实夫妇交换视频| 中文字幕9999| 老司机凹凸av亚洲导航| 一区二区xxx| 性欧美疯狂xxxxbbbb| 草碰在线视频| 国产视色精品亚洲一区二区| 热久久久久久久| 国产午夜小视频| 啊v视频在线一区二区三区| 亚洲精品国产动漫| 精品国产aⅴ一区二区三区东京热| 色狠狠一区二区三区香蕉| 第一av在线| 在线观看成人免费|