Можно ли изменить переменную переключателя внутри корпуса? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь запустить некоторый код, чтобы изменить переменную 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 голосов
/ 27 марта 2019

Я предлагаю превратить 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

0 голосов
/ 27 марта 2019

Только в коде, который вы показали, это выглядит более чем подозрительно

Почему бы не switch на вашем входе и покончить с этим

while(true) 
{

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

Если вам нуженконечный автомат или более сложная иерархия, я предлагаю разбить это на более логические единицы, а не пытаться делать все в одном цикле

...