当前位置: 首页 > 编程语言 > C#

Yield工作模式分享

时间:2023-04-11 02:27:13 C#

Yield工作模式当我有一个代码块时staticvoidMain(){foreach(intiinYieldDemo.SupplyIntegers()){Console.WriteLine("{0}被foreach消耗了迭代",i);}}classYieldDemo{publicstaticIEnumerableSupplyIntegers(){yieldreturn1;收益回报2;收益回报3;SupplyIntegers()|1||2||3|存储在连续的内存块中。“IEnumerator”的指针移动到|1|控制从SupplyInteger()返回到Main()。Main()打印值指针移动到|2|,等等。说明:(1)通常我们会允许函数内部有一个有效的return语句。出现多个yieldreturn,yieldreturn,...语句时C#如何处理?(2)一旦遇到return,是不是就没有办法再次控制回到SupplyIntegers(),允许的话不再从1开始yield?我的意思是产量1?不——远离它;我会给你写一个手写的版本……太蹩脚了!请注意,如果您理解foreach实际上会有所帮助:while(iterator.MoveNext()){i=iterator.Current;安慰。WriteLine("{0}被foreach迭代消耗",i);}}使用系统;使用系统集合;使用System.Collections.Generic;staticclassProgram{staticvoidMain(){foreach(intiinYieldDemo.SupplyIntegers()){Console.WriteLine("{0}被foreach迭代消耗",i);}}}classYieldDemo{publicstaticIEnumerableSupplyIntegers(){returnnewYieldEnumerable();}classYieldEnumerable:IEnumerable{publicIEnumeratorGetEnumerator(){returnnewYieldIterator();}IEnumeratorIEnumerable.GetEnumerator(){返回GetEnumerator();}}类YieldIterator:IEnumerator{privateintstate=0;私人我新台币值;publicintCurrent{get{返回值;}}objectIEnumerator.Current{get{returnCurrent;}}voidIEnumerator.Reset(){thrownewNotSupportedException();}voidIDisposable.Dispose(){}publicboolMoveNext(){switch(state){case0:value=1;状态=1;返回真;情况1:值=2;状态=2;返回真;情况2:值=3;状态=3;返回真;默认值:返回假;正如您所看到的,它在迭代器内部构建了一个状态机,状态机由MoveNext给出,我使用了带有状态字段的模式,因为您可以看到这对于更复杂的迭代器很有用,因为它是如何工作的。重要提示:C#编译器执行此操作的方式非常复杂,但它使编写迭代器变得轻而易举。它只是一个语法糖,.net为你生成IEnumerator类并实现MoveNext、Current和Reset方法,而不是生成IEnumarable类GetEnumerator,返回IEnumerator,你可以通过.net反射器或ildasm看到神奇的类。另见此处简单地说,迭代器块(或带有yield语句的方法,如果可能)由编译器转换为编译器生成的类。此类实现IEnumerator并将yield语句转换为类的“状态”。例如,这个:yieldreturn1;收益回报2;收益回报3;可能会变成这样:switch(state){case0:gotoLABEL_A;情况1:转到LABEL_B;情况2:转到LABEL_C;}LABEL_A:返回1;LABEL_B:返回2;LABEL_C:返回3;迭代器块可以看作是一个抽象状态机。此代码将由IEnumerator的方法调用。简而言之,(在等待长版本的marc时)当编译器看到yield语句时,它会在幕后为您构建自定义类的新实例,它实现了一个名为IEnumerator的接口,该接口具有Current()方法,和MoveNext(),并跟踪您当前在迭代过程中的位置...在上面的示例中,它还将跟踪正在枚举的列表中的值。以上就是C#学习教程的全部内容:回报率的工作模式。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: