Страница 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(х < 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 < 5; i++) {</b>
<b> switch(i) {</b>
<b> case 1:</b>
<b> Console.WriteLine("В ветви case 1"); </b>
<b> goto case 3; </b>
<b> case 2:</b>
<b> Console.WriteLine("В ветви case 2"); </b>
<b> goto case 1; </b>
<b> case 3:</b>
<b> Console.WriteLine("В ветви case 3"); </b>
<b> goto default; </b>
<b> default:</b>
<b> Console.WriteLine("В ветви default"); </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. Так, если удалить символы комментария в начале следующей строки: