C#迭代器局部變量是什么

這篇文章主要介紹了C#迭代器局部變量是什么,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了揚(yáng)州免費(fèi)建站歡迎大家使用!

看看***的測試,是不是不管具體的集合如何改變,遍歷代碼都非常穩(wěn)定?而且擴(kuò)展新的集合類也非常方便,只是添加代碼不會(huì)修改原來的代碼,符合開閉原則。當(dāng)然,這么好的解決方案微軟當(dāng)然不會(huì)放過,現(xiàn)在C# 2.0里已經(jīng)內(nèi)置了對C#迭代器的支持,看看System.Collections, System.Collections.Generic命名空間,所有的集合都實(shí)現(xiàn)了這個(gè)接口:IEnumerable,這個(gè)接口還有泛型的版本。注意到這個(gè)接口只有一個(gè)方法:IEnumerator GetEnumerator();,IEnumerator就是C#迭代器的接口,相當(dāng)于我的實(shí)例里面的Iterator,它也有泛型的版本。

那么現(xiàn)在在.net里所有的集合類都可以這樣訪問了:

IEnumerator ienumerator = list.GetEnumerator();  while(ienumerator.MoveNext())  {  object current = ienumerator.Current;  }

但是這樣訪問也太麻煩了,所以C#里出現(xiàn)了foreach關(guān)鍵字,我們來看看foreach背后發(fā)生了什么

public static void Main()  {  ArrayList list = new ArrayList();  list.Add(1);  list.Add(2);  list.Add(3);  foreach (object item in list)  {  Console.WriteLine(item.ToString());  }  }

下面是它對應(yīng)的IL代碼:

.method private hidebysig static void Main() cil managed  {  .entrypoint  .maxstack 2  .locals init (  [0] class [mscorlib]System.Collections.ArrayList list,  [1] object item,  [2] class [mscorlib]System.Collections.IEnumerator CS$5$0000,  [3] class [mscorlib]System.IDisposable CS$0$0001)  L_0000: newobj instance void [mscorlib]System.Collections.ArrayList::.ctor()  L_0005: stloc.0   L_0006: ldloc.0   L_0007: ldc.i4.1   L_0008: box int32  L_000d: callvirt instance int32 [mscorlib]System.Collections.ArrayList::Add(object)  L_0012: pop   L_0013: ldloc.0   L_0014: ldc.i4.2   L_0015: box int32  L_001a: callvirt instance int32 [mscorlib]System.Collections.ArrayList::Add(object)  L_001f: pop   L_0020: ldloc.0   L_0021: ldc.i4.3   L_0022: box int32  L_0027: callvirt instance int32 [mscorlib]System.Collections.ArrayList::Add(object)  L_002c: pop   L_002d: ldloc.0   L_002e: callvirt instance class [mscorlib]System.Collections.IEnumerator [mscorlib]System.Collections.ArrayList::GetEnumerator()  L_0033: stloc.2   L_0034: br.s L_0048  L_0036: ldloc.2   L_0037: callvirt instance object [mscorlib]System.Collections.IEnumerator::get_Current()  L_003c: stloc.1   L_003d: ldloc.1   L_003e: callvirt instance string [mscorlib]System.Object::ToString()  L_0043: call void [mscorlib]System.Console::WriteLine(string)  L_0048: ldloc.2   L_0049: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()  L_004e: brtrue.s L_0036  L_0050: leave.s L_0063  L_0052: ldloc.2   L_0053: isinst [mscorlib]System.IDisposable  L_0058: stloc.3   L_0059: ldloc.3   L_005a: brfalse.s L_0062  L_005c: ldloc.3   L_005d: callvirt instance void [mscorlib]System.IDisposable::Dispose()  L_0062: endfinally   L_0063: call string [mscorlib]System.Console::ReadLine()  L_0068: pop   L_0069: ret   .try L_0034 to L_0052 finally handler L_0052 to L_0063  }

從.locals init 那里可以看出編譯器為我們添加了兩個(gè)C#迭代器局部變量,一個(gè)就是C#迭代器。

L_002d: ldloc.0   L_002e: callvirt instance class [mscorlib]System.Collections.IEnumerator [mscorlib]System.Collections.ArrayList::GetEnumerator()  L_0033: stloc.2

這三行代碼告訴我們,調(diào)用list的GetEnumerator()方法,獲取C#迭代器實(shí)例將其賦值給編譯器為我們添加的那個(gè)C#迭代器局部變量,接著是L_0034: br.s L_0048,br.s這個(gè)指令是強(qiáng)制跳轉(zhuǎn),我們接著看

L_0048: ldloc.2   L_0049: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C#迭代器局部變量是什么”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

當(dāng)前題目:C#迭代器局部變量是什么
網(wǎng)頁地址:http://bm7419.com/article26/gipejg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化小程序開發(fā)、移動(dòng)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司