91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

阜南县| 漠河县| 鄱阳县| 九江县| 保山市| 乌审旗| 吴桥县| 葫芦岛市| 林甸县| 建昌县| 达尔| 广昌县| 酉阳| 浏阳市| 大埔区| 钟山县| 宣武区| 远安县| 碌曲县| 富阳市| 佛山市| 宣威市| 苏尼特左旗| 遂溪县| 思茅市| 云安县| 百色市| 湖南省| 长垣县| 佳木斯市| 错那县| 玛沁县| 鹤庆县| 壤塘县| 仁化县| 宿迁市| 双鸭山市| 准格尔旗| 黎城县| 子洲县| 额尔古纳市|