学习枚举随笔,用来复习

如果要对一个对象使用foreach,那么它必须包含一个GetEnumerator()方法,无参数,返回类型任意,同时返回的类型必须包含Current属性和MoveNext方法。编译器会自动去绑定,因此不需要IEnumerable和IEnumerator。接口的本质应该就是让编译器去绑定一个对象的方法,在这里,C#编译器的确不依赖接口。
下面的代码不使用IEnumerable和IEnumerator:

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

namespace ConsoleApplication1
{
    class Program
    {
        public class MyClass
        {
            public class MyEnumerator
            {
                private string[] value;
                private int n = -1;
                public MyEnumerator(string[] value) { this.value = value; }
                public object Current
                {
                    get { return value[n]; }
                }

                public bool MoveNext()
                {
                    return ++n < value.Length;
                }
            }

            string[] names = { "name1", "name2", "name3"};

            public MyEnumerator GetEnumerator()
            {
                return new MyEnumerator(names);
            }
        }

        static void Main(string[] args)
        {
            MyClass titles = new MyClass();

            foreach (string title in titles)
            {
                Console.WriteLine(title);
            }
            Console.Read();
        }
    }
}

 至于yield,则是C#编译器自动为你产生两个类,一个包含GetEnumerator,一个包含Current和MoveNext

posted @ 2013-11-14 16:35  VU  阅读(141)  评论(0编辑  收藏  举报