在此Switch语句中可以使用Goto语句吗?

时间:2019-05-03 23:06:51

标签: c#

我知道使用goto语句并不常见。但是,我不知道是否有必要在这里将其替换为其他东西。

此伪代码是一种状态机,取决于某些条件,我需要能够“跳转”到特定点。只要通过串行通信接收到一点,就会调用此代码。

switch (Actual_state)
{               

    case "FirstState":

        if(restriction)goto case "FourthState"; 

        //state code
        Actual_state = Next_state;
        break;

    case "SecondState":
        //state code
        Actual_state = Next_state;             
        break;

    case "ThirdState":
        //state code
        Actual_state = Next_state;
        break;

    case "FourthState":
        //state code
        Actual_state = Next_state;
        break;

    case "FifthState":
        //state code
        goto case "SixthState"; //if the statement code is complete I need it to go directly to next state, else it would overwrite some info and I don't want more variables. make any suggestion you want.
        break;

    case "SixthState":
        //state code
        Actual_state = Next_state;            
        break;

    case "LastState":
        Actual_state = "FirtState";
        break;
}

一切正常,但我希望对此工作流程发表一些意见。如果是垃圾,可以这样说。

1 个答案:

答案 0 :(得分:4)

此代码需要重构。

状态机是一种常见的模式;如果您想使用该模式,那么我建议您实际上实现一个状态机类型。状态机的本质是什么?

  • 从起始状态开始保持状态
  • 需要输入
  • 根据输入和状态,它会产生输出(或效果,但最好不是两者),并进入新状态

interface IStateMachine<TIn, TOut, TState>
{
  TOut Next(TIn input);
  TState State { get; }
  bool IsHalted { get; }
}

现在您可以实现通过实现此接口来实现状态机逻辑的基类abstract class StateMachine<TIn, TOut, TState>吗?请特别注意如何表示转换函数。

现在您可以将逻辑实现为基本类型的派生类型吗?