精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美三级一区| 麻豆tv免费在线观看| 538在线精品| 成人黄色大片在线观看 | 欧美男人天堂| 欧美激情一区二区三区在线| 亚洲综合中文字幕在线| 538任你躁在线精品视频网站| 黑色丝袜福利片av久久| 在线影院国内精品| 国产激情片在线观看| 人操人视频在线观看| 美日韩一区二区三区| 欧美激情一区二区三区高清视频| 免费看黄色的视频| 中文字幕资源网在线观看| 99久久综合国产精品| 国产精品一区久久久| 国产男女猛烈无遮挡a片漫画| 国产亚洲精彩久久| 午夜视频一区在线观看| 亚洲午夜精品久久久久久浪潮| 国产手机在线视频| 99精品视频在线观看播放| 亚洲国产精品va在线看黑人动漫| 欧美三级午夜理伦三级富婆| www欧美xxxx| 国产成人欧美日韩在线电影| 欧美在线一区二区视频| 免费中文字幕视频| 日韩精品不卡一区二区| 亚洲精品视频免费| 亚洲成人福利视频| 日韩在线激情| 在线观看国产91| 成人毛片视频网站| 欧洲成人综合网| 亚洲欧洲精品成人久久奇米网| 精品日本一区二区| 国产无遮挡免费视频| 99re久久最新地址获取| 亚洲天堂久久av| 可以直接看的无码av| 国产乱论精品| 精品国产欧美一区二区| 亚洲理论电影在线观看| av在线free| 中文字幕五月欧美| 亚洲视频欧美在线| 亚洲s色大片| 中文一区一区三区高中清不卡| 欧美少妇一区| 美国一级片在线免费观看视频| aaa亚洲精品一二三区| 国产成人精品日本亚洲11| 国产黄频在线观看| 国产激情视频一区二区三区欧美| 91精品国产综合久久香蕉922| 小向美奈子av| 午夜精品一区二区三区国产| 久久精品国产69国产精品亚洲 | 妖精视频一区二区三区| 亚洲国产日韩欧美在线图片| 国产精品无码在线| 中文字幕伦av一区二区邻居| 国产亚洲精品91在线| 娇妻被老王脔到高潮失禁视频| 国产在线观看91一区二区三区| 亚洲欧洲在线视频| 亚洲一级黄色录像| 亚洲91视频| 欧美国产视频一区二区| 国产精品不卡av| 美女网站久久| 伊人精品在线观看| 95视频在线观看| 国产精品99久久久久久董美香| 一区二区三区在线免费观看 | 影音先锋中文字幕一区| 777777777亚洲妇女| 亚洲中文字幕无码爆乳av| 免费成人在线影院| 不卡视频一区| 手机福利小视频在线播放| 国产精品无人区| 97超碰在线视| 大胆人体一区| 亚洲一区二三区| 免费在线a视频| 精品视频在线一区二区在线| 欧美群妇大交群的观看方式| 丰满人妻一区二区三区53视频| 国产高清不卡| 欧美日韩一区在线| 欧美 日韩 激情| 亚洲成人一区在线观看| 欧美一区二区黄色| 亚洲一区二区观看| 亚洲欧洲日韩| 欧美诱惑福利视频| 黄色小说在线观看视频| 视频一区视频二区中文字幕| 久久久欧美一区二区| 极品国产91在线网站| 国产精品自在欧美一区| 国产精自产拍久久久久久蜜| 东京干手机福利视频| 久久精品日韩一区二区三区| 九九九九精品九九九九| 中文字幕在线免费| 久久精品一区二区三区四区| 中文字幕第50页| 92国产精品| 日韩一级欧美一级| 一本色道综合亚洲| 精品国产日本| 在线国产91| 精品国产91久久久久久老师| 天天干天天综合| 亚洲精品合集| 欧美精品久久久久久久久久| 一卡二卡在线视频| 久久久久久久久一| 精品无码国模私拍视频| 经典三级久久| 在线亚洲欧美视频| 阿v天堂2014| 亚洲福利专区| 99视频日韩| 国产区在线观看| 精品视频一区二区三区免费| 亚洲乱码国产乱码精品精大量| 无需播放器亚洲| 国产精品久久久久久久久借妻| 香蕉av在线播放| 亚洲3atv精品一区二区三区| 又大又长粗又爽又黄少妇视频| 久久中文字幕av| 国产精品视频999| 国产视频网址在线| 色婷婷av一区二区三区大白胸| 亚洲 欧美 日韩在线| 午夜日本精品| 成人动漫视频在线观看免费| 成人免费视屏| 日韩一级视频免费观看在线| 26uuu成人网| 国产黄色精品网站| 女人被男人躁得好爽免费视频 | 成人激情在线播放| av播放在线| 欧美三级电影网| 精品手机在线视频| 亚洲五月综合| 91精品视频在线播放| 老司机在线永久免费观看| 欧美性生交片4| 日日操免费视频| 国模无码大尺度一区二区三区| 黄色高清视频网站| 嫩呦国产一区二区三区av| 九色91av视频| 色呦呦免费观看| 欧美性xxxxx极品娇小| 熟女俱乐部一区二区| 日本不卡的三区四区五区| 亚欧洲精品在线视频免费观看| 成人免费视频观看| 久久久久999| 精品欧美一区二区精品少妇| 亚洲国产日产av| 色悠悠久久综合网| 天天影视综合| 国产精品一区二区你懂得| 欧产日产国产精品视频| 亚洲一区二区精品| 国产精品高潮呻吟久久久| 亚洲黄色小说网站| 久久久久麻豆v国产精华液好用吗| 欧美专区在线| 在线不卡日本| 肉色欧美久久久久久久免费看| 亚洲欧美综合另类中字| 亚洲在线视频播放| 91在线免费视频观看| 成人一区二区三| 国产精品久久天天影视| 国产伦精品一区二区三区在线| 伊人色综合一区二区三区影院视频| 一区二区三区视频在线| 国产免费视频一区二区三区| 亚洲第一福利一区| 日韩精品电影一区二区三区| 国产99久久久久| 午夜激情福利在线| 午夜精品电影| 日本视频精品一区| 2023国产精华国产精品| 久久亚洲国产成人| 天天舔天天干天天操| 欧美日韩中字一区| 香蕉视频一区二区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 日韩精品一区二区三区四区| 天堂网视频在线| 一区二区三区日韩精品视频| jizz中文字幕| 成人av免费观看| 国产福利精品一区二区三区| 久久国产精品亚洲77777| 天天做天天爱天天高潮| 国产一区二区三区日韩精品| 97碰碰视频| 91天天综合| 欧美一区二区三区图| 亚洲wwwww| 日韩在线小视频| 欧美午夜黄色| 亚洲缚视频在线观看| 99久久国产热无码精品免费| 欧美最猛性xxxxx直播| 国产又黄又粗又爽| 亚洲影院久久精品| 免费在线观看一级片| 国产精品免费网站在线观看| 另类小说第一页| 亚洲伊人网站| 欧美午夜性视频| 欧美在线国产| 日本一二三区视频在线| 日韩精品欧美激情一区二区| 欧美日韩高清在线一区| 欧美在线关看| 好看的日韩精品| 97一区二区国产好的精华液| 91久久在线播放| 亚洲人成网站在线在线观看| 国产精品激情av电影在线观看| 松下纱荣子在线观看| 韩剧1988在线观看免费完整版| av在线app| 色综合久久久久久中文网| 1stkiss在线漫画| 久久国产精品亚洲| 91最新在线视频| 欧美另类暴力丝袜| 手机av在线播放| 久久久亚洲国产天美传媒修理工| 日韩伦理电影网站| 久久免费视频网| 国产资源在线观看入口av| 久久99精品久久久久久噜噜| 性欧美videos高清hd4k| 欧美精品xxx| 理论片午夜视频在线观看| 欧美野外猛男的大粗鳮| xx欧美视频| 国产精品福利无圣光在线一区| 一区二区视频免费完整版观看| 久久精品国产69国产精品亚洲| 欧美成年黄网站色视频| zzjj国产精品一区二区| 国产淫片在线观看| 欧美国产极速在线| а√在线中文在线新版| 欧美一区二三区| 日本欧美韩国| 国产欧美最新羞羞视频在线观看| 日韩欧国产精品一区综合无码| 91九色视频导航| 国产精品极品在线观看| 久久综合一区二区三区| 日韩激情免费| 国产人妻人伦精品| 国产免费成人| 日韩不卡一二区| 影音先锋中文字幕一区二区| 国产h视频在线播放| 三级久久三级久久久| www.日本久久| 99国产一区二区三精品乱码| 国产美女永久免费无遮挡| 亚洲欧美激情在线| 日韩美女黄色片| 欧美日韩一级片在线观看| www久久久久久| 亚洲系列中文字幕| 99热国产在线| 日本一区二区在线免费播放| 亚洲精品一区av| 精品国产综合| 久久久久国产精品| 男人揉女人奶房视频60分| 六月丁香综合在线视频| 大尺度做爰床戏呻吟舒畅| 欧美激情中文不卡| www.av视频在线观看| 欧美精品一卡二卡| 手机在线观看免费av| 久久精品男人天堂| 亚洲私拍视频| yellow视频在线观看一区二区 | 福利一区在线| 国产美女99p| 欧美电影三区| 欧美xxxxx在线视频| 高清久久久久久| 美国黄色片视频| 色婷婷精品久久二区二区蜜臂av| 国产jzjzjz丝袜老师水多| 尤物九九久久国产精品的特点| 青春草视频在线观看| 国产精品一香蕉国产线看观看| 林ゆな中文字幕一区二区| 99热都是精品| 免费人成在线不卡| 大又大又粗又硬又爽少妇毛片 | 97精品久久| 中文字幕精品—区二区日日骚| 西西裸体人体做爰大胆久久久| 精品国产午夜福利在线观看| 欧美国产97人人爽人人喊| 国产性猛交╳xxx乱大交| 欧美刺激脚交jootjob| 久操视频在线播放| 国产精品久久久久久久天堂| 亚洲人成网77777色在线播放 | 免费在线看成人av| 少妇户外露出[11p]| 亚洲成人激情综合网| 国产三级精品在线观看| 久久精品夜夜夜夜夜久久| 福利一区二区三区视频在线观看| 欧美性大战久久久久| 亚洲免费影视| 波多野结衣福利| 欧美日韩中文字幕在线| 天天色综合av| 91国内揄拍国内精品对白| 欧美wwwsss9999| www..com日韩| 99在线精品观看| 亚洲精品1区2区3区| 亚洲精品久久久久久久久| 精精国产xxxx视频在线播放| 国产欧美日韩综合精品二区| 精品91视频| 在线免费观看a级片| 精品久久久久久亚洲国产300| 午夜视频在线播放| 5566日本婷婷色中文字幕97| 青青草这里只有精品| 99精品视频在线看| 国产亚洲精品久| 亚洲一区二区天堂| 久久精品成人欧美大片古装| 日韩精品中文字幕一区二区 | 老熟妇高潮一区二区三区| 制服.丝袜.亚洲.另类.中文| 制服丝袜中文字幕在线| 国产精品日韩一区二区三区| 亚洲美女网站| 北条麻妃av高潮尖叫在线观看| 久久午夜羞羞影院免费观看| 国产成人无码专区| 最新91在线视频| 国产精品777777在线播放| 黄色激情在线视频| 久久亚洲精品小早川怜子| 91黑人精品一区二区三区| 色爱精品视频一区| 国产一区二区三区| 三上悠亚久久精品| 国产欧美日韩三区| 国产熟女一区二区三区五月婷| 欧美国产日韩视频| 伊人春色精品| 特级黄色片视频| 欧美日韩国产中文字幕| 草碰在线视频| 成人午夜电影免费在线观看| av成人毛片| 日本裸体美女视频| 日本韩国欧美一区| 麻豆传媒视频在线观看| 国产日韩久久| 麻豆久久久久久| 激情五月色婷婷| 最新日韩中文字幕| 国产劲爆久久| 色一情一区二区三区| 午夜日韩在线电影| 人人干在线视频| 国产九区一区在线| 久久精品国产色蜜蜜麻豆| 日韩av在线电影| 久久精品视频亚洲| 一区二区三区韩国免费中文网站| 国产精品嫩草影院8vv8| 疯狂欧美牲乱大交777|