成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#迭代器局部變量

開發 后端
這里介紹C#迭代器局部變量,IEnumerator就是C#迭代器的接口,相當于我的實例里面的Iterator,它也有泛型的版本。

C#迭代器還是比較常見的東西,這里我們主要介紹C#迭代器局部變量,包括介紹C#里出現了foreach關鍵字等方面。

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

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

  1. IEnumerator ienumerator = list.GetEnumerator();  
  2. while(ienumerator.MoveNext())  
  3. {  
  4. object current = ienumerator.Current;  

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

  1. public static void Main()  
  2. {  
  3. ArrayList list = new ArrayList();  
  4. list.Add(1);  
  5. list.Add(2);  
  6. list.Add(3);  
  7. foreach (object item in list)  
  8. {  
  9. Console.WriteLine(item.ToString());  
  10. }  
  11. }  

下面是它對應的IL代碼:

  1. .method private hidebysig static void Main() cil managed  
  2. {  
  3. .entrypoint  
  4. .maxstack 2  
  5. .locals init (  
  6. [0] class [mscorlib]System.Collections.ArrayList list,  
  7. [1] object item,  
  8. [2] class [mscorlib]System.Collections.IEnumerator CS$5$0000,  
  9. [3] class [mscorlib]System.IDisposable CS$0$0001)  
  10. L_0000: newobj instance void [mscorlib]System.Collections.ArrayList::.ctor()  
  11. L_0005: stloc.0   
  12. L_0006: ldloc.0   
  13. L_0007: ldc.i4.1   
  14. L_0008: box int32  
  15. L_000d: callvirt instance int32 [mscorlib]System.Collections.ArrayList::Add(object)  
  16. L_0012: pop   
  17. L_0013: ldloc.0   
  18. L_0014: ldc.i4.2   
  19. L_0015: box int32  
  20. L_001a: callvirt instance int32 [mscorlib]System.Collections.ArrayList::Add(object)  
  21. L_001f: pop   
  22. L_0020: ldloc.0   
  23. L_0021: ldc.i4.3   
  24. L_0022: box int32  
  25. L_0027: callvirt instance int32 [mscorlib]System.Collections.ArrayList::Add(object)  
  26. L_002c: pop   
  27. L_002d: ldloc.0   
  28. L_002e: callvirt instance class [mscorlib]System.Collections.IEnumerator [mscorlib]
  29. System.Collections.ArrayList::GetEnumerator()  
  30. L_0033: stloc.2   
  31. L_0034: br.s L_0048  
  32. L_0036: ldloc.2   
  33. L_0037: callvirt instance object [mscorlib]System.Collections.IEnumerator::get_Current()  
  34. L_003c: stloc.1   
  35. L_003d: ldloc.1   
  36. L_003e: callvirt instance string [mscorlib]System.Object::ToString()  
  37. L_0043: call void [mscorlib]System.Console::WriteLine(string)  
  38. L_0048: ldloc.2   
  39. L_0049: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()  
  40. L_004e: brtrue.s L_0036  
  41. L_0050: leave.s L_0063  
  42. L_0052: ldloc.2   
  43. L_0053: isinst [mscorlib]System.IDisposable  
  44. L_0058: stloc.3   
  45. L_0059: ldloc.3   
  46. L_005a: brfalse.s L_0062  
  47. L_005c: ldloc.3   
  48. L_005d: callvirt instance void [mscorlib]System.IDisposable::Dispose()  
  49. L_0062: endfinally   
  50. L_0063: call string [mscorlib]System.Console::ReadLine()  
  51. L_0068: pop   
  52. L_0069: ret   
  53. .try L_0034 to L_0052 finally handler L_0052 to L_0063  

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

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

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

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

【編輯推薦】

  1. C# lock關鍵字敘述
  2. C#.Net FrameWork簡介
  3. C# new和override簡單描述
  4. C#值類型和引用類型淺談
  5. C#標識符簡單分析
責任編輯:佚名 來源: IT168
相關推薦

2009-08-27 10:08:36

C#隱含類型局部變量

2009-08-26 15:39:08

C#隱式類型局部變量

2009-09-17 13:05:38

Linq局部變量類型

2009-08-26 16:26:37

C#迭代器模式

2009-08-11 13:59:41

迭代器模式C# Iterator

2009-08-19 15:18:53

迭代器

2018-05-14 09:15:24

Python變量函數

2009-09-11 10:07:05

Linq隱式類型化局部

2009-10-12 14:13:00

VB.NET使用局部變

2009-12-15 10:48:54

Ruby局部變量

2020-11-11 21:26:48

函數變量

2024-05-29 08:49:22

Python全局變量局部變量

2015-01-07 14:41:32

Android全局變量局部變量

2021-09-28 07:12:09

函數內存

2010-03-15 09:32:56

Python函數

2017-02-08 12:28:37

Android變量總結

2009-09-22 17:21:24

線程局部變量

2023-09-24 23:40:54

Python變量

2009-08-18 17:17:05

C#局部類型

2010-10-14 09:34:34

JVM局部變量
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久精品国产 | 成人免费在线播放视频 | 日本午夜在线视频 | 国产精品久久午夜夜伦鲁鲁 | 欧美激情在线精品一区二区三区 | 视频二区 | 日韩国产中文字幕 | 97精品视频在线 | 午夜视频在线观看一区二区 | 在线成人 | 亚洲视频一区二区三区 | 999精品在线| 亚洲欧美日韩在线一区二区 | 一级毛片观看 | 天堂一区二区三区 | 国产精品一区二区久久 | 成人精品鲁一区一区二区 | 国产精品久久免费观看 | 国产精品毛片无码 | 久久lu | 毛片网在线观看 | 最新中文字幕在线 | 久草视频在线播放 | 日本偷偷操 | 夜色www国产精品资源站 | 国产91一区 | 在线欧美一区 | 国产一区二区三区四区hd | 综合二区| 国产视频在线观看一区二区三区 | 孰女乱色一区二区三区 | 欧产日产国产精品视频 | 久久国产精品视频 | 亚洲高清在线视频 | 日本二区在线观看 | 伊人手机在线视频 | 亚洲欧美一区二区三区在线 | 人人干人人干人人 | 久久国产精品免费一区二区三区 | 亚洲女人天堂成人av在线 | 国产 日韩 欧美 中文 在线播放 |