foreach遍历原理解析

为什么有些类可以可以用foreach遍历,有些类却不可以了.经反编译过后得出:

-------------------------------------------------------------------------------下面我们来看看自己如何实现一个类遍历-------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Myforeach
{
    class Program
    {
        static void Main(string[] args)
        {      
            Person p = new Person();
            p[0] = "宝马";
            p[1] = "奥迪";
            p[2] = "阿斯顿马丁";
            //for (int i = 0; i < p.Count; i++)
            //{
            //    Console.WriteLine(p[i]);
            //}

            //任何类型,只要想使用foreach来循环遍历,就必须在当前类型中
            //存在: public IEnumerator GetEnumerator()方法,(一般情况我们会通过实现IEnumerable接口,来创建该方法。)
            foreach (string item in p)
            {
                Console.WriteLine(item);
            }

            //IEnumerator etor = p.GetEnumerator();
            //while (etor.MoveNext())
            //{
            //    string str = etor.Current.ToString();
            //    Console.WriteLine(str);
            //}
            Console.ReadKey();


        }
    }

    public class Person : IEnumerable
    {
        private List listCar = new List();

        public int Count
        {
            get
            {
                return this.listCar.Count;
            }

        }

        public string this[int index]
        {
            get
            {
                return listCar[index];
            }

            set
            {
                if (index >= listCar.Count)
                {
                    listCar.Add(value);
                }
                else
                {
                    listCar[index] = value;
                }
            }
        }
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public string Email
        {
            get;
            set;
        }

        #region IEnumerable 成员

        //这个方法的作用不是用来遍历的,而是用来获取一个对象
        //这个对象才是用来遍历的。
        public IEnumerator GetEnumerator()
        {
            return new PersonEnumerator(listCar);
        }

        #endregion
    }

    //这个类型,的作用就是用来遍历Person中的List集合的。
    public class PersonEnumerator : IEnumerator
    {
        public PersonEnumerator(List _cars)
        {
            cars = _cars;
        }

        //这个字段中存储的就是Person对象中的listCar集合
        private List cars;


        //假设一开始遍历的对象的索引是-1
        private int index = -1;

        #region IEnumerator 成员


        //表示获取当前正在遍历的那个对象
        public object Current
        {
            get
            {
                if (index < 0)
                {
                    return null;
                }
                return cars[index];
            }
        }
        //让自定义下标index累加
        public bool MoveNext()
        {
            index = index + 1;
            if (index >= cars.Count)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

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

        #endregion
    }
}
   

你可能感兴趣的:(Asp.net)