返回顶部
首页 > 资讯 > 精选 >C#迭代器局部变量是什么
  • 163
分享到

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

2023-06-17 23:06:19 163人浏览 泡泡鱼
摘要

这篇文章主要介绍了C#迭代器局部变量是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。看看***的测试,是不是不管具体的集合如何改变,遍历代码都非常稳定?而且扩展新的集合类

这篇文章主要介绍了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#迭代器局部变量是什么”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: C#迭代器局部变量是什么

本文链接: https://lsjlt.com/news/294201.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#迭代器局部变量是什么
    这篇文章主要介绍了C#迭代器局部变量是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。看看***的测试,是不是不管具体的集合如何改变,遍历代码都非常稳定?而且扩展新的集合类...
    99+
    2023-06-17
  • C#隐含类型局部变量是什么
    本篇内容主要讲解“C#隐含类型局部变量是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#隐含类型局部变量是什么”吧!总体来说,Visual Studio 2008和.NET 3.5是建立在...
    99+
    2023-06-17
  • java中什么是局部变量
    今天就跟大家聊聊有关java中什么是局部变量,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系...
    99+
    2023-06-14
  • C语言全局变量和局部变量的示例代码
    目录局部变量全局变量局部变量和全局变量的综合示例在《C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能...
    99+
    2023-05-20
    C语言 全局变量 局部变量
  • C++ 函数的局部变量和全局变量有什么区别?
    c++++ 局部变量和全局变量的区别:可见性:局部变量仅限于定义函数,而全局变量在整个程序中可见。内存分配:局部变量在栈上分配,而全局变量在全局数据区分配。作用域:局部变量在函数内,而全...
    99+
    2024-04-19
    全局变量 局部变量 c++ 作用域
  • python局部变量指的是什么
    这篇文章将为大家详细讲解有关python局部变量指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、概念函数内部定义的变量称为局部变量,局部变量只能在定义函数内部使用。局部变量的作用域仅限于定义其...
    99+
    2023-06-15
  • js局部变量指的是什么
    这篇文章将为大家详细讲解有关js局部变量指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。说明局部作用域声明的变量称为局部变量(函数内部定义的变量)局部变量只能能使用局部变量。var在函数内部声明的...
    99+
    2023-06-20
  • java中全局变量和局部变量的区别是什么?
    全局变量是编程术语中的一种,源自于变量之分。全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。局部变量(Local variables):在方法内部(包括main()方法)定义的变量是局...
    99+
    2021-11-24
    java教程 java 全局变量 局部变量
  • JavaScript局部变量与全局变量的作用域是什么
    本文小编为大家详细介绍“JavaScript局部变量与全局变量的作用域是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript局部变量与全局变量的作用域是什么”文章能帮助大家解决疑惑,下面...
    99+
    2024-04-02
  • c++局部变量怎么声明
    在C++中,局部变量声明的语法如下: 数据类型 变量名; 其中,数据类型表示变量的类型,可以是C++内置的数据类型,也可以是自定义...
    99+
    2024-02-29
    c++
  • javascript中局部变量是什么意思
    小编给大家分享一下javascript中局部变量是什么意思,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 在javascript中,局部变量是在函数体内声明的变...
    99+
    2024-04-02
  • python全局变量和局部变量有什么区别
    Python中的全局变量和局部变量的区别如下:1. 作用域:全局变量在整个程序中都是可见的,可以在任何地方访问。而局部变量只在定义它...
    99+
    2023-08-12
    python
  • c#局部变量怎么给全局使用
    在 c# 中,可以通过以下方法使局部变量作为全局变量使用:声明全局变量,使用 static 关键字。声明共享变量,使用 const 关键字。使用静态方法,该方法不依赖于实例。使用委托,将...
    99+
    2024-05-12
    c#
  • python中全局变量和局部变量有什么区别
    python中全局变量和局部变量有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;...
    99+
    2023-06-14
  • C语言——全局变量和局部变量重名了会怎么样
    前言 (1)今天在交流群里面看到这样一个问题: 为什么这个程序中下面我定义的void型函数smart在全局变量前声明了,但是在man函数中调用了smart函数,m的值打印出来还是0。 #includeint m;void smart(...
    99+
    2023-08-30
    学习 c语言
  • C语言多线程局部变量共享的方法是什么
    在C语言中,多线程之间共享局部变量是一种危险的行为,容易导致数据竞争和不确定的结果。因此,一般不推荐直接共享局部变量。 然而,如果确...
    99+
    2023-10-27
    C语言
  • Python中迭代和迭代器是什么
    本篇文章给大家分享的是有关Python中迭代和迭代器是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。可迭代一个对象,物理或者虚拟存储的序列。list,tuple,strin...
    99+
    2023-06-17
  • java局部变量怎么赋值给全局变量
    在Java中,局部变量是在方法内部定义的变量,它的作用范围仅限于该方法。全局变量是在类的范围内定义的变量,可以被类中的所有方法访问。...
    99+
    2023-10-10
    java
  • C++11的移动迭代器是什么
    本篇内容介绍了“C++11的移动迭代器是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!劳苦功高的曳光弹类为了说明移动迭代器还是继续请出曳...
    99+
    2023-06-19
  • JavaScript全局变量是什么
    这篇文章主要讲解了“JavaScript全局变量是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript全局变量是什么”吧!   ES20...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作