中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-12-01 16:29:52 來源:億速云 閱讀:164 作者:小新 欄目:編程語言

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

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

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

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

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

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());  }  }

下面是它對應的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 那里可以看出編譯器為我們添加了兩個C#迭代器局部變量,一個就是C#迭代器。

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

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

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“C#迭代器局部變量是什么”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富民县| 白朗县| 五寨县| 会泽县| 柳州市| 金昌市| 莱阳市| 洪洞县| 林周县| 瓮安县| 阳高县| 观塘区| 景洪市| 龙江县| 黔江区| 全州县| 孟连| 获嘉县| 赤水市| 西丰县| 济源市| 洛川县| 阿拉善左旗| 正安县| 荣昌县| 县级市| 山丹县| 当雄县| 武隆县| 松溪县| 兴化市| 磐石市| 玛沁县| 双牌县| 吕梁市| 和平县| 全南县| 广南县| 宁化县| 巴中市| 额济纳旗|