是否可以在案例中更改开关变量?

时间:2019-03-27 05:03:38

标签: c# switch-statement

我正在尝试运行一些代码来将switch变量更改为跳到我想要的任何情况。我有种误解的感觉。

int option = 0;

while(true) {

  switch(option) {

    case 0:
       ConsoleKeyInfo TurnChoice = Console.ReadKey();

       switch(TurnChoice.key) 
       {

       case ConsoleKey.M
         option = 2;
         break;

       case ConsoleKey.S
         option = 1;
         break;
       }
       break;

    case 1:
       /* run some code */
       break;

    case 2: 
       /* run some code */
    ...

我希望在按下case: 2键时它会跳到M,但它只会不断循环case: 0

2 个答案:

答案 0 :(得分:0)

仅在您显示的代码上,这看起来就有点怀疑了

为什么不输入switch并完成输入

while(true) 
{

  switch(Console.ReadKey()) 
  {
     case ConsoleKey.M :
       // do M stuff
       break;
     ...

如果您需要状态机或更复杂的层次结构,我建议将其分解为更多的逻辑单元,而不是尝试在一个循环中做所有事情

答案 1 :(得分:0)

我建议将switch变成if / else,在这里您可以合法地修改option

   while (true) {
     if (0 == option) {
       ConsoleKeyInfo TurnChoice = Console.ReadKey();

       if (TurnChoice.key == ConsoleKey.M) 
         option = 2;
       else if (TurnChoice.key == case ConsoleKey.S)
         option = 1;
     } 

     if (1 == option) {
       ...
     }
     else if (2 == option) { // drop "else" if option can be changed within if (option == 1)
       ...
     } 
   }

另一种(不太可读的)可能性是放continue而不是break

while(true) {

  switch(option) {

    case 0:
       ConsoleKeyInfo TurnChoice = Console.ReadKey();

       switch(TurnChoice.key) 
       {

       case ConsoleKey.M
         option = 2;
         continue;        // <- continue instead of break

       case ConsoleKey.S
         option = 1;
         continue;        // <- continue instead of break
       }
       ...

在这种情况下,我们将option更改为while,然后重新输入switch