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

使用“yield”关键字实现状态机共享

时间:2023-04-11 02:52:17 C#

使用“yield”关键字实现状态机是否可以使用yield关键字来实现这里展示的简单状态机。在我看来,C#编译器似乎已经为您完成了艰苦的工作,因为它在内部实现了一个状态机来使yield语句起作用。你能利用编译器已经在做的事情并让它为你实现大部分状态机吗?有没有人这样做过,技术上可行吗?这行得通,但这是个坏主意。创建迭代器块是为了帮助您为集合编写自定义迭代器,而不是为了解决实现状态机的通用问题。如果要写状态机,就写状态机。这并不难。如果您正在编写大量状态机,请编写一个有用的辅助方法库,使您能够干净地表示状态机,然后使用您的库。但是,不要滥用具有完全不同意图的语言结构,这些语言结构恰好将状态机用作实现细节。这使您的状态机代码难以阅读、理解、调试、维护和扩展。(顺便说一句,当我读到你的名字时,我做了两件事。C#的一位设计师也叫MattWarren!)是的,它绝对可行且容易实现。您可以使用控制流结构(for、foreach、while、...goto(使用goto对此特别有用;)))以及yield来构建一个。IEnumeratorStateMachine(FunccurrentInput/*从IO端口获取当前输入*/,FunccurrentOutput){for(;;){if((currentInput()&1)==0)yieldreturnnewState("Ready");else{if(...){yieldreturnnewState("期待更多数据");SendOutput(currentOutput());while((currentInput()&2)!=0)//whiledevicebusyyieldreturnnewState("Busy");elseif(...){...}}}}//消费者:int数据;varfsm=StateMachine(ReadFromIOPort,()=>数据);//...while(fsm.Current!="Expectingmoredata")fsm.MoveNext();数据=100;fsm.MoveNext();虽然这不是传统意义上的状态机,但这篇关于基于迭代器的微线程的文章被创造性地用于状态动作。IEnumerablePatrol(){while(alive){if(CanSeeTarget()){yieldreturnAttack();}elseif(InReloadStation){信号signal=AnimateReload();屈服返回信号;}else{MoveTowardsNextWayPoint();TimeSpan.FromSeconds(1);};产量中断;迭代器块确实实现了状态机,但棘手的一点是获取下一个输入。你怎么知道下一步要去哪里?我想您可能有某种共享的“当前转换”变量,但这有点愚蠢。如果您不需要任何输入(例如,您的状态机只是在状态之间循环)那么这很容易,但这不是有趣的课程:)您能描述一下您感兴趣的状态机吗?以上就是C#学习教程:使用“yield”关键字实现状态机分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: