• C# foreach 原理以及模拟的实现


     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();
            }
        }

  • 相关阅读:
    替身邮:同一个邮箱多个名字
    CAGD: 第九章 几何连续性1
    Windows 2008 server 安装 Windows Live Essential 2011 的问题
    设计、仿真、工艺、加工、优化、开发交流QQ群 106930856 行业软件、二次开发、优化技术
    著佐权(Copyleft)
    Proe 二次开发:Session(会话) 对象
    CAGD: 第八章 曲线的几何处理技术
    UG/NX FEA 网格
    CAGD第十二章B样条曲面2
    推荐网络硬盘:金山快盘 15G
  • 原文地址:https://www.cnblogs.com/ityuanmanito/p/4039993.html
Copyright © 2020-2023  润新知