На этом шаге мы рассмотрим синтаксис и пример использования этой инструкции.
Инструкция безусловного перехода goto позволяет выполнить переход к определенному месту программного кода, помеченному с помощью метки. Метка - это обычный идентификатор, размещаемый в программном коде. Метку не нужно объявлять. Она просто указывается, и после нее следует двоеточие. Если в программном коде воспользоваться инструкцией goto, указав после нее метку из программного кода, то выполнение такой команды приведет к тому, что следующей будет выполняться команда в строке, выделенной с помощью метки.
Таким образом, инструкция goto позволяет "прыгать" из одного места программного кода к другому, и это не может не вызывать некоторых опасений. Стоит признать, что они небезосновательны. Существует устоявшееся мнение, что наличие в программном коде команд с инструкцией goto - признак дурного тона в программировании. Другими словами, использование инструкции goto - это не тот путь, которым следует идти. Но прежде чем отказаться от использования какого-либо механизма, интересно хотя бы поверхностно оценить его возможности.
Как иллюстрацию к использованию инструкции goto мы рассмотрим программу, в которой традиционно вычисляется сумма нечетных чисел. Но на этот раз циклические конструкции использовать не будем, а прибегнем к помощи условной конструкции и, как несложно догадаться, инструкции goto. Интересующий нас программный код представлен ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr43_1 { class Program { static void Main() { // Переменные: количество слагаемых, индексная // переменная и значение суммы: int n = 10, k = 1, s = 0; // Отображение сообщения: Console.Write("Сумма 1 + 3 + 5 +...+ {0} = ",2*n-1); // Использование метки: mylabel: // Добавляем слагаемое в сумму: s += 2 * k - 1; // Изменение значения индексной переменной: k++; // Использование инструкции goto: if(k<=n) goto mylabel; // Переход к помеченному коду // Отображение результата вычислений: Console.WriteLine(s); // Задержка: Console.ReadLine(); } } }
Результат выполнения этой программы такой же, как и в случаях, когда мы использовали операторы цикла.
Рис.1. Результат выполнения программы
Как же выполняется этот программный код? В принципе, все достаточно просто. В программе использованы, как и ранее, три целочисленные переменные n, k и s, назначение которых не изменилось - это количество слагаемых, индексная переменная и значение суммы чисел. Переменные получают начальные значения при объявлении. В программе использована метка mylabel. Это простой идентификатор, который заканчивается двоеточием. Само по себе наличие метки в программном коде никаких ощутимых последствий не имеет. То есть факт наличия метки на логику выполнения программного кода не влияет. На выполнение программного кода влияет наличие инструкции goto. Более конкретно, код выполняется следующим образом. После объявления и инициализации переменных n, k и s и отображения сообщения о вычислении суммы (команда
Console.Write("Сумма 1 + 3 + 5 +...+ {0} = ", 2*n-1)
На следующем шаге мы рассмотрим перехват исключений.