оператор goto в C # - PullRequest
       13

оператор goto в C #

5 голосов
/ 06 декабря 2011

Я пишу функцию, как в C #:

public void CountNumber() 
{
       for(int i = 0; i < 40; i++) {
          if(i > 20) {
               goto out1;
          }

          Console.WriteLine("hello " + 1);

          out1:
             string hello = "";
       }
}

Это в основном подсчитывает число, и если i больше 20, оно не должно записывать в console.writeline. он должен перешагнуть и нажать «out1», но в конце «out1» должна быть функция для компиляции. Для компиляции требуется строка "hello =" "". Мне не нужна строка "hello =" "". Я просто хочу, чтобы он ничего не делал и получил конец цикла. Есть ли способ сделать это без "string hello =" "", который нужен выражению out1:? Как:

public void CountNumber() 
{
       for(int i = 0; i < 40; i++) {
          if(i > 20) {
               goto out1;
          }

          Console.WriteLine("hello " + 1);

          out1:
       }
}

Спасибо.

Ответы [ 6 ]

27 голосов
/ 06 декабря 2011

Хотя абсолютно правильно сказать, что есть более эффективные способы решения этой проблемы, чем использование goto, я отмечаю, что никто не ответил на ваш вопрос.

Метка должна обозначать выражение .Вы хотите перейти в местоположение, с которым не связано заявление.Вы можете сделать пустой оператор с одной точкой с запятой или пустым блоком.

    out1:
    ;
} 

или

    out1:
    {}
}

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

17 голосов
/ 06 декабря 2011

Этот цикл может быть легко записан многими другими способами - вы можете просто выполнить цикл пока i<=20 вместо i<40 (лучший) или переместить вызов Console.WriteLine в оператор if с инвертированным оператором if.

Тем не менее, я предполагаю, что вы пытаетесь работать с более сложным сценарием в вашем «реальном» случае.Если это так, вместо использования goto, просто используйте continue, чтобы пропустить остаток цикла:

public void CountNumber() 
{
   for(int i = 0; i < 40; i++) {
      if(i > 20) {
         continue; // Skips the rest of this loop iteration
      }

      Console.WriteLine("hello " + 1);
   }
}

Аналогично, вы можете использовать break, чтобы полностью вырваться из цикла ине обрабатывать больше элементов, если это более уместно в вашем реальном случае.

10 голосов
/ 06 декабря 2011

Просто измените ваше состояние - также альтернативой может быть if...else. Я предполагаю, что есть другой код, в противном случае вы можете просто изменить сам цикл for, чтобы просто считать до 20.

   for(int i = 0; i < 40; i++) 
   {
      if(i <= 20) 
      {
          Console.WriteLine("hello " + 1);
      }
      //other code
   }
5 голосов
/ 06 декабря 2011

Есть некоторые другие подобные goto операторы, которые вы должны использовать:

  • continue переходит к следующей итерации текущего цикла.
  • break выходит из токовой петли
  • return выход из текущего метода

Вы должны учитывать goto, только если ничего из вышеперечисленного не делает то, что вы хотите. И по моему опыту, это очень редко бывает.

Похоже, вы хотите использовать continue здесь.

4 голосов
/ 06 декабря 2011

Для этого можно использовать ключевое слово continue:

public void CountNumber()  {
  for(int i = 0; i < 40; i++) {
    if(i > 20) {
      continue;
    }
    Console.WriteLine("hello " + 1);
  }
}

Однако рассмотрите возможность использования if вместо:

public void CountNumber()  {
  for(int i = 0; i < 40; i++) {
    if(i <= 20) {
      Console.WriteLine("hello " + 1);
    }
  }
}
1 голос
/ 06 декабря 2011
public void CountNumber() 
{
       for(int i = 0; i < 40; i++) {
          if(i > 20) {
              continue;
          }

          Console.WriteLine("hello " + 1);

       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...