一.为什么数组和集合可以使用foreach遍历

01. 因为数组和集合都实现了IEnumerable接口,该接口中只有一个方法,GetEnumerator()

02.数组类型是从抽象基类型 Array 派生的引用类型。由于此类型实现了 IEnumerable ,因此可以对 C# 中的所有数组使用 foreach 迭代。(摘自MSDN)

二.探讨针对于List集合微软的是怎么实现这个IEnumerable接口的

该接口的方法

public interface IEnumerable

    {

        // 摘要:

        //     返回一个循环访问集合的枚举数。

        //

        // 返回结果:

        //     一个可用于循环访问集合的 System.Collections.IEnumerator 对象。

        [DispId(-)]

        IEnumerator GetEnumerator();

}

对于GetEnumerator这个方法他的返回值时又是一个接口类型。所以在这里还要看IEnumerator的接口内容。

public interface IEnumerator

    {

        // 摘要:

        //     获取集合中的当前元素。

        //

        // 返回结果:

        //     集合中的当前元素。

        object Current { get; }

        // 摘要:

        //     将枚举数推进到集合的下一个元素。

        //

        // 返回结果:

        //     如果枚举数成功地推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。

        //

        // 异常:

        //   System.InvalidOperationException:

        //     在创建了枚举数后集合被修改了。

        bool MoveNext();

        //

        // 摘要:

        //     将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。

        //

        // 异常:

        //   System.InvalidOperationException:

        //     在创建了枚举数后集合被修改了。

        void Reset();

    }

所以不难发现微软是通过这种方法的实现遍历迭代变量的

三.通过C#代码实现自定义类型的集合遍历

首先该类必须实现IEnumerable接口

 //01自定义类型:实现IEnumerable接口,证明这个类型保存的数据能被foreach遍历

    //IEnumberable这个接口,在微软底层有一个方法GetEnumerator()返回值类型是IEnumerator接口

    public class MyList:IEnumerable

    {

        //02定义一个集合

        ArrayList list=new ArrayList();

        //03实现IEnumberable的方法

        public IEnumerator GetEnumerator()

        {

           return new MyIEnumerator(list);

        }

        public void Add(Object oj)

        {

            list.Add(oj);

        }

}
//IEnumerator:支持对非泛型集合的简单迭代

    public class MyIEnumerator:IEnumerator

    {

        //01定义一个List集合

        ArrayList list=new ArrayList();

        //02无参构造

        public MyIEnumerator(ArrayList list)

        {

            //跟当前类的集合赋值

            this.list = list;

        }

        public object Current

        {

            get { return list[index]; }

        }

        //04默认将集合的索引指向前一个

        ;

        //05实现接口的Movenext方法

        public bool MoveNext()

        {

            bool happy = false;//默认为没有数据

             > index)

            {

                //证明集合中有数据让索引加1

                index++;

                //改变bool值为true

                happy = true;

            }

            return happy;

        }

        public void Reset()

        {

            index = -;

        }

    }
 MyList list=new MyList();

     list.Add("小王");

     list.Add("小李");

     foreach (string item in list)

     {

         Console.WriteLine(item);

      }

    Console.ReadKey();

探讨关于C#中Foreach的本质的更多相关文章

  1. 接口、索引器、Foreach的本质(学习笔记)

    接口 什么是接口? 接口代表一种能力,和抽象类类似但比抽象类的抽象程度更高! 接口的定义: public interface IEat//定义一个接口 { void Eat(string food); ...

  2. C#中foreach的实现原理

    C#中foreach的实现原理 在探讨foreach如何内部如何实现这个问题之前,我们需要理解两个C#里边的接口,IEnumerable 与 IEnumerator. 在C#里边的遍历集合时用到的相关 ...

  3. ecshop中foreach的详细用法归纳

    ec模版中foreach的常见用法. foreach 语法: 假如后台:$smarty->assign('test',$test); {foreach from=$test item=list ...

  4. mybatis中foreach的用法(转)

    foreach一共有三种类型,分别为List,[](array),Map三种. foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.inf ...

  5. thinkphp模板中foreach循环没数据的错误解决

    从控制器方法中$this->assign();函数将值传递给html模板 但是模板不显示数据,直接出来的是代码,效果就和html中写了php代码不能解析一样. 原来是我将thinkphp框架的引 ...

  6. c语言中函数调用的本质从汇编角度分析

    今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的 ...

  7. php中foreach()函数与Array数组经典案例讲解

    //php中foreach()函数与Array数组经典案例讲解 function getVal($v) { return $v; //可以加任意检查代码,列入要求$v必须是数字,或过滤非法字符串等.} ...

  8. PHP中foreach()用法汇总

    这篇文章主要给大家详细介绍了PHP中foreach()用法以及相关的示例,十分的细致,有需要的小伙伴可以参考下. PHP 4 引入了 foreach 结构,和 Perl 以及其他语言很像.这只是一种遍 ...

  9. flask中路由的本质源码分析

    flask中url的本质: 吧url和视图函数封装到一个Rule对象里面去了,并且吧这个对象添加到url_map中 Rule={"url":'/index','method':'i ...

随机推荐

  1. C#基础之lock

    1.lock的本质 实现线程同步的第一种方式是我们经常使用的lock关键字,它将包围的语句块标记为临界区,这样一次只有一个线程进入临界区并执行代码.下面第一段的几行代码是关于lock关键字的使用方式, ...

  2. 如何在WPF中引用Windows.System.Forms.Integration

    转自 http://www.cnblogs.com/sinozhang1988/archive/2012/11/28/2792804.html “未找到程序集 WindowsFormsIntegrat ...

  3. WIN7下USB多点触摸,一次发多个数据包的延迟问题,重要!

    这个问题很常见, 花了差不多一个星期时间来解决.硬件相关的东西太多坑了,而且这些坑不像代码那样可见.   使用混合模式,每次最多报告2个点.如果是5点则需要上报三次. 问题就来了,atmel的CTP最 ...

  4. Xamarin 的 MVVM 之 Caliburn.Micro

    约定 Caliburn.Micro 以下简称 CMXamarin.Form 以下简称 XF 摘要CM 当前已释出 3.0 beta 版https://github.com/Caliburn-Micro ...

  5. 第四十课:CSS3 transition详解

    W3C中对transition是这样描述的:允许css的属性值在一定的时间内平滑的过渡,也就是说,以动画的效果改变css的属性值. transition主要包含4个属性值:transition-pro ...

  6. hdu3966 树链剖分+成段更新

    给你n个点,m条边,p次操作.n个点相连后是一棵树.每次操作可以是x 到 y 增加 z,或者减z,或者问当前点的值是多少. 可以将树分成链,每个点在线段树上都有自己的点,然后线段树成段更新一下. #p ...

  7. JS~json日期格式化

    起因 对于从C#返回的日期字段,当进行JSON序列化后,在前台JS里显示的并不是真正的日期,这让我们感觉很不爽,我们不可能为了这东西,把所有日期字段都变成string吧,所以,找了一个JS的扩展方法, ...

  8. Fedora21下安装cuda7.5

    Fedora21装cuda7.5 首先制作启动U盘.装好fedora21后别做任何update等yum和rpm操作,按照下面步骤走. 其中遇到用UEFI模式安装cuda时,系统一定要求提供公钥和私钥, ...

  9. BZOJ1202 狡猾的商人

    HNOI2005 Day1 T4 Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1, ...

  10. 苹果开发者账号如何多人协作进行开发和真机调试XCode

    首先,先说明一下,我们最容易误解或者理解错误的是:p12证书. 其实p12证书,最直接的使用就是,我们在一台电脑上生成好了cer证书之后,如果使用了开发者账号(无论公司或者个人的)进行ipa进行打包和 ...