【发布时间】:2010-12-09 17:27:47
【问题描述】:
我想出了以下选项:
使用 goto 语句:
Start:
goto Data
Data:
goto Finish
Finish:
;
使用 switch 语句:
switch(m_state) {
case State.Start:
m_state = State.Data;
break;
case State.Data:
m_state = State.Finish;
break;
case State.Finish:
break;
}
同时使用 goto 和 switch:
switch(m_state) {
case State.Start:
goto case State.Data2;
case State.Data1:
goto case State.Finish;
case State.Data2:
m_state = State.Data1;
//call to a function outside the state machine
//that could possibly change the state
break;
case State.Finish:
break;
}
我更喜欢使用 goto 语句的第一个选项,因为它更快且更简洁。但我不确定这是否是最佳选择。也许性能明智,但谈到可读性我不知道。这就是我问这个问题的原因。您更喜欢哪个选项,为什么?
【问题讨论】:
-
您的状态机是要主动执行,还是会受到来自外部的推动? label 方法表明您的状态机将积极地继续执行并拉动冲动,但可能会使处理不受其控制的外部影响变得更加困难。我会说使用 switch 语句,但还有其他方法。
-
谨防在此处大声说出 goto 字样。总是有代码纯粹主义者潜伏着等待最小的理由开始抱怨他们宝贵的模式和最佳实践。 Goto 在他们的书中是最糟糕的...... ;^)
-
它将继续积极执行发射令牌。根据从外部设置的标志,它会在必要时更改状态。
-
我相信他们可以看到在状态机中使用 goto 的好处。反正你会到处跳。
-
niek:我更喜欢第一个。它尽可能简洁地传达您想要实现的目标。您可能会选择在每个标签之后启动本地范围(因此 { .... } ),这样您就可以在状态机的每个步骤中使用局部变量
标签: c# switch-statement goto state-machine