foreach遍歴原理解析

3347 ワード

なぜいくつかのクラスは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
    }
}