学习枚举随笔,用来复习
如果要对一个对象使用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