Добавить в цитаты Настройки чтения

Страница 54 из 502

Оператор return организует возврат из метода. Его можно также использовать для возврата значения. Более подробно он рассматривается в главе 6.

Оператор goto

Имеющийся в C# оператор goto представляет собой оператор безусловного перехода. Когда в программе встречается оператор goto, ее выполнение переходит непосредственно к тому месту, на которое указывает этот оператор. Он уже давно "вышел из употребления" в программировании, поскольку способствует созданию "макаронного" кода. Тем не менее оператор goto все еще находит применение — иногда даже эффективное. В этой книге не делается никаких далеко идущих выводов относительно правомочности использования оператора goto для управления программой. Следует, однако, подчеркнуть, что этому оператору трудно найти полезное применение, и поэтому он не особенно нужен для полноты языка программирования. Хотя в некоторых случаях он оказывается удобным и дает определенные преимущества, если используется благоразумно. В силу этих причин оператор goto упоминается только в данном разделе книги. Главный недостаток оператора goto с точки зрения программирования заключается в том, что он вносит в программу беспорядок и делает ее практически неудобочитаемой. Но иногда применение оператора goto может, скорее, прояснить, чем запутать ход выполнения программы.

Для выполнения оператора goto требуется метка — действительный в C# идентификатор с двоеточием. Метка должна находиться в том же методе, где и оператор goto, а также в пределах той же самой области действия. В приведенном ниже примере программы цикл суммирования чисел от 1 до 100 организован с помощью оператора goto и соответствующей метки.

<b>х = 1; </b>

<b>loopl: х++;</b>

<b>if(х &lt; 100) goto loopl;</b>

Кроме того, оператор goto может быть использован для безусловного перехода к ветви case или default в операторе switch. Формально ветви case или default выполняют в операторе switch роль меток. Поэтому они могут служить адресатами оператора goto. Тем не менее оператор goto должен выполняться в пределах оператора switch. Это означает, что его нельзя использовать как внешнее средство для безусловного перехода в оператор switch. В приведенном ниже примере программы демонстрируется применение оператора goto в операторе switch.

<b>// Применить оператор goto в операторе switch.</b>

<b>using System;</b>

<b>class SwitchGoto { </b>

<b>  static void Main() {</b>

<b>    for(int i=1; i &lt; 5; i++) {</b>

<b>      switch(i) {</b>

<b>      case 1:</b>

<b>        Console.WriteLine(&quot;В ветви case 1&quot;); </b>

<b>        goto case 3; </b>

<b>      case 2:</b>

<b>        Console.WriteLine(&quot;В ветви case 2&quot;); </b>

<b>        goto case 1; </b>

<b>      case 3:</b>

<b>        Console.WriteLine(&quot;В ветви case 3&quot;); </b>

<b>        goto default; </b>

<b>      default:</b>

<b>        Console.WriteLine(&quot;В ветви default&quot;); </b>

<b>        break;</b>

<b>      }</b>

<b>      Console.WriteLine();</b>

<b>    }</b>

<b>    // goto case 1; </b><b>// Ошибка! Безусловный переход к оператору switch недопустим.</b>

<b>  }</b>

<b>}</b>

Вот к какому результату приводит выполнение этой программы.

<b>В ветви case 1 </b>

<b>В ветви case 3 </b>

<b>В ветви default</b>

<b>В ветви case 2 </b>

<b>В ветви case 1 </b>

<b>В ветви case 3</b>

<b>В ветви default</b>

<b>В ветви case 3 </b>

<b>В ветви default</b>

<b>В ветви default</b>

Обратите внимание на то, как оператор goto используется в операторе switch для перехода к другим его ветвям case или к ветви default. Обратите также внимание на то, что ветви case не оканчиваются оператором break. Благодаря тому что оператор goto препятствует последовательному переходу от одной ветви case к другой, упоминавшееся ранее правило недопущения "провалов" не нарушается, а следовательно, необходимость в применении оператора break в данном случае отпадает. Но как пояснялось выше, оператор goto нельзя использовать как внешнее средство для безусловного перехода к оператору switch. Так, если удалить символы комментария в начале следующей строки: