public class Person:IEnumerable     //定义一个person类  并且 实现IEnumerable 接口  (或者不用实现此接口 直接在类 //里面写个GetEnumerator()方法)
    {
        string[] names = { "小杨", "科比布莱恩特", "凯文杜兰特", "卡门安东尼" };
//在Person类里面定义一个字符串数组,以便用来模仿对象的索引访问

public int Count { get { return names.Length; } } 
  //可以通过对象访问此属性

public string this[int index]    //定义一个索引器
        {
            get { return names[index]; }
        }

public IEnumerator GetEnumerator()
        {
            return new MyClass(names);             //实际上通过此方法就是返回一个可以实现循环的类的对象  
                                                   // 用他的对象来移动索引
        }
    }

public class MyClass :IEnumerator
      {
          public MyClass(string[] names)                //一个参数的构造函数,用来和要遍历的类的进行关联
          {
              name = names;
          }
          private string[] name;                        //用此字段来存放接收过来的数组
          int index = -1;
          public object Current                        //获取当前索引的元素的值
          {
              get 
              {
                  if (index<0)                        //准备状态是-1,开始循环了在MoveNext中加1
                  {
                      return null;
                  }
                  else
                  {
                      return name[index];
                  }
              }
          }

public bool MoveNext()
          {
              ++index;                                      //每调用此方法就将索引往下+1
              if (index<name.Length)
              {
                  return true;
              }
              else
              {
                  return false;
              }
          }

public void Reset()
          {
             index=-1;
          }

}

在主方法里面:

class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            //for (int i = 0; i < p.Count; i++)
            //{
            //    Console.WriteLine(p[i]);
            //}
            foreach (string item in p)
            {
                Console.WriteLine(item);
            }
            //实际执行foreach就相当于执行下面几句话:
            Console.WriteLine("==================================================");
            IEnumerator p1 = p.GetEnumerator();
            while (p1.MoveNext())
            {
                string str=(string)p1.Current;
                Console.WriteLine(str);
            }
            Console.ReadKey();
        }
    }

C# foreach 原理以及模拟的实现的更多相关文章

  1. Foreach原理

    本质:实现了一个IEnumerable接口, 01.为什么数组和集合可以使用foreach遍历? 解析:因为数组和集合都实现了IEnumerable接口,该接口中只有一个方法,GetEnumerato ...

  2. .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化

    1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...

  3. Array.forEach原理,仿造一个类似功能

    Array.forEach原理,仿造一个类似功能 array.forEach // 设一个arr数组 let arr = [12,45,78,165,68,124]; let sum = 0; // ...

  4. C#学习笔记:foreach原理

    这篇随笔是对上一篇随笔C#关键字:yield的扩展. 关于foreach 首先,对于 foreach ,大家应该都非常熟悉,这里就简单的描述下. foreach 语句用于对实现  System.Col ...

  5. ThreadLocal原理与模拟

    首先用一个程序模拟一下ThreadLocal: public class ThreadLocal1 { private static Dictionary<Thread, Integer> ...

  6. 浅析foreach原理

    在日常开发工作中,我们发现很多对象都能通过foreach来遍历,比如HashTable.Dictionary.数组等数据类型.那为何这些对象能通过foreach来遍历呢?如果写一个普通的Person类 ...

  7. 【进阶3-5期】深度解析 new 原理及模拟实现(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/24 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的 ...

  8. java——集合、泛型、ArrayList、LinkedList、foreach循环、模拟ktv点歌系统

    集合:一系列特殊的类,这些类可以存储任意类型的对象,长度可变,集合类都在java.util包中. 但是集合记不住对象的类型,当把对象从集合中取出时这个对象的编译类型就变成了Object类型.这样在取元 ...

  9. C#foreach原理

    本文主要记录我在学习C#中foreach遍历原理的心得体会. 对集合中的要素进行遍历是所有编码中经常涉及到的操作,因此大部分编程语言都把此过程写进了语法中,比如C#中的foreach.经常会看到下面的 ...

随机推荐

  1. 自定义控件(视图)1期笔记01:View 和 ViewGroup

    1.View 和 ViewGroup 图解关系: 2. View 和 ViewGroup 关系和作用: (1) 关系: • 继承关系 • 组合关系 (2) 作用:      • View的作用: 提供 ...

  2. MySQL(4):数据表创建

    数据库是表的容器,表,必须属于某个数据库. 可以通过.语法,指明数据表所属的数据库 比如:database.table 进行表操作的时候,都会指定当前的默认数据库. use db_name; 1.创建 ...

  3. Android(java)学习笔记127:Android Studio新建工程中的build.gradle、settings.gradle

    随着信息化的快速发展,IT项目变得越来越复杂,通常都是由多个子系统共同协作完成.对于这种多系统.多项目的情况,很多构建工具都已经提供了不错的支持,像maven.ant.Gradle除了借鉴了ant或者 ...

  4. android studio的里的 content_XXX_xml问题

    遇到这个问题就是androidStudio的版本问题,androidStudio会出现这个问题是在androidStudio1.4以上版本当遇到这个问题的时候建Activity的时候选择EmptyAc ...

  5. Redis命令参考(Keys & String)

    r = redis.Redis(ip, port, index) 如此实例化一个redis对象,index取值0-15,一个redis对象有16个库. Keys 函数 功能 返回值 备注 keys(s ...

  6. C语言进行CGI程序设计

    一.CGI概述 CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准.Web服务器通过调用CGI程序实现和Web浏览器的交互, 也就是CGI程序接受Web浏览器发送给 ...

  7. transition和animation动画简介

    本文介绍CSS动画的两大组成部分:transition和animation.我不打算给出每一条属性的详尽介绍,那样可以写一本书.这篇文章只是一个简介,帮助初学者了解全貌,同时又是一个快速指南,当你想不 ...

  8. Smarty中一些标签的使用

    Smarty中的标签和php中的标签不一样 foreach标签{foreach   from=$goods(变量名) key='键,不带$' item='值,不带$'}中间的显示内容{/foreach ...

  9. 用jsp方式通知客户端下载文件

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  10. JAXB - Annotations, Annotations for the Schema: XmlSchema

    This annotation can only be used with a package. It defines parameters that are derived from the xsd ...