yield是C#为了简化遍历操作实现的语法糖,我们知道如果要要某个类型支持遍历就必须要实现系统接口IEnumerable,这个接口后续实现比较繁琐要写一大堆代码才能支持真正的遍历功能。举例说明
1 using System; 2 using System.Collections.Generic; 3 using System.Collections; 4 using System.Linq; 5 using System.Text; 6 7 namespace 8 { 9 class Program10 {11 static void Main(string[] args)12 {13 HelloCollection helloCollection = new HelloCollection();14 foreach (string s in helloCollection)15 {16 Console.WriteLine(s);17 }18 19 Console.ReadKey();20 }21 }22 23 //public class HelloCollection : IEnumerable24 //{25 // public IEnumerator GetEnumerator()26 // {27 // yield return "Hello";28 // yield return "World";29 // }30 //}31 32 public class HelloCollection : IEnumerable33 {34 public IEnumerator GetEnumerator()35 {36 Enumerator enumerator = new Enumerator(0);37 return enumerator;38 }39 40 public class Enumerator : IEnumerator, IDisposable41 {42 private int state;43 private object current;44 45 public Enumerator(int state)46 {47 this.state = state;48 }49 50 public bool MoveNext()51 {52 switch (state)53 {54 case 0:55 current = "Hello";56 state = 1;57 return true;58 case 1:59 current = "World";60 state = 2;61 return true;62 case 2:63 break;64 }65 return false;66 }67 68 public void Reset()69 {70 throw new NotSupportedException();71 }72 73 public object Current74 {75 get { return current; }76 }77 78 public void Dispose()79 {80 }81 }82 }83 }
上面注释的部分引用了"yield return”,其功能相当于下面所有代码!可以看到如果不适用yield需要些很多代码来支持遍历操作。
yield return 表示在迭代中下一个迭代时返回的数据,除此之外还有yield break, 其表示跳出迭代,为了理解二者的区别我们看下面的例子
1 class A : IEnumerable 2 { 3 private int[] array = new int[10]; 4 5 public IEnumerator GetEnumerator() 6 { 7 for (int i = 0; i < 10; i++) 8 { 9 yield return array[i];10 }11 }12 }
如果你只想让用户访问ARRAY的前8个数据,则可做如下修改.这时将会用到yield break,修改函数如下
1 public IEnumerator GetEnumerator() 2 { 3 for (int i = 0; i < 10; i++) 4 { 5 if (i < 8) 6 { 7 yield return array[i]; 8 } 9 else10 {11 yield break;12 }13 }14 }
这样,则只会返回前8个数据.