Słowa kluczowego goto używamy gdy chcemy przeskoczyć we wskazane miejsce w kodzie. Miejsce to musi zostać oznaczone etykietą. Etykieta to dowolna fraza zakończona dwukropkiem.
Polecenie goto należy traktować bardziej jako ciekawostkę, gdyż jest rzadko wykorzystywane w programowaniu obiektowym.

Przykład:
Wprowadźmy użycie słowa kluczowego goto w aplikacji napisanej w poprzednim wpisie. Przypomnę najpierw działanie aplikacji:

Aplikacja wykorzystuje instrukcję warunkową switch. Aplikacja będzie miała za zadanie obsługę konta. Użytkownik może wykonać w niej następujące operacje:

  1. Wypisanie stanu konta. Zakładam że stan początkowy to 12500
  2. Pobranie pieniędzy z konta
  3. Wypłata pieniędzy
  4. Zakończenie działania aplikacji

W obecnej chwili aplikacja wykona się tylko raz. Czyli będzie można wykonać jedną operację.

Kod programu:

class Program {
        static void Main() {
            double stan = 12500;
            int wybor;
            double kwota;

            Console.WriteLine("Menu:");
            Console.WriteLine("1 - Stan konta");
            Console.WriteLine("2 - Pobranie pieniędzy z konta");
            Console.WriteLine("3 - Wpłata pieniędzy z konta");
            Console.WriteLine("4 - Zakończenie pracy programu");
            Console.WriteLine("Podaj nr operacji: ");
            int.TryParse(Console.ReadLine(), out wybor);
            switch (wybor) {
                case 1:
                    Console.WriteLine("Stan konta wynosi: " + stan);
                    break;
                case 2:
                    Console.WriteLine("Podaj kwotę do pobrania:");
                    double.TryParse(Console.ReadLine(), out kwota);
                    stan -= kwota;
                    break;
                case 3:
                    Console.WriteLine("Podaj kwotę do wpłacenia:");
                    double.TryParse(Console.ReadLine(), out kwota);
                    stan += kwota;
                    break;
                case 4:
                    Console.WriteLine("Koniec działania programu");
                    break;
                default:
                    Console.WriteLine("Nie ma takiej  operacji w menu");
                    break;
            }

            Console.ReadLine();

        }

Efekt działania aplikacji:

goto_1

Rys. Wybór opcji 1- Wypisanie na ekranie stanu konta

W programie występuje następujący problem: wybrana przez użytkownika operacja zostanie wykonana tylko raz. Można go rozwiązać stosując pętlę lub słowo kluczowe goto. Pętlami zajmiemy się w kolejnych wpisach, a więc wykorzystajmy drugą opcję:

  class Program {
        static void Main() {
            double stan = 12500;
            int wybor;
            double kwota;
            Menu:
            Console.WriteLine("Menu:");
            Console.WriteLine("1 - Stan konta");
            Console.WriteLine("2 - Pobranie pieniędzy z konta");
            Console.WriteLine("3 - Wpłata pieniędzy z konta");
            Console.WriteLine("4 - Zakończenie pracy programu");
            Console.WriteLine("Podaj nr operacji: ");
            int.TryParse(Console.ReadLine(), out wybor);
            switch (wybor) {
                case 1:
                    Console.WriteLine("Stan konta wynosi: " + stan);
                    goto Menu;               
                case 2:
                    Console.WriteLine("Podaj kwotę do pobrania:");
                    double.TryParse(Console.ReadLine(), out kwota);
                    stan -= kwota;
                    goto Menu;  
                case 3:
                    Console.WriteLine("Podaj kwotę do wpłacenia:");
                    double.TryParse(Console.ReadLine(), out kwota);
                    stan += kwota;
                    goto Menu;  
                case 4:
                    Console.WriteLine("Koniec działania programu");
                    break;
                default:
                    Console.WriteLine("Nie ma takiej  operacji w menu");
                    goto Menu; 
            }

            Console.ReadLine();
        }
        }

Rezultat działania aplikacji:

Rezultat działania aplikacji

Rys. Aplikacja do zarządzania kontem

Poprzez zastosowanie słowa kluczowego goto jesteśmy teraz w stanie dokonać więcej niż jednej operacji w naszej aplikacji. W kodzie aplikacji przed wypisaniem menu dodałem etykietę, która nazywa się Menu, a następnie w instrukcji warunkowej switch wymienione zostało słowo kluczowe break na goto. Z jednym wyjątkiem w przypadku wyboru opcji zakończenia programu. Dzięki temu gdy wybierzemy opcję 4 zostanie wyświetlony komunikat, a następnie program się zakończy.

Oczywiście nie musimy za każdym razem wyświetlać menu. Przeróbmy nasz program:

class Program {
        static void Main() {
            double stan = 12500;
            int wybor;
            double kwota;

            Menu:
            Console.WriteLine("Menu:");
            Console.WriteLine("1 - Stan konta");
            Console.WriteLine("2 - Pobranie pieniędzy z konta");
            Console.WriteLine("3 - Wpłata pieniędzy z konta");
            Console.WriteLine("4 - Wyświetlenie menu programu");
            Console.WriteLine("5 - Zakończenie pracy programu");
        
            Wprowadz:
            Console.WriteLine("Podaj nr operacji: ");
            int.TryParse(Console.ReadLine(), out wybor);
            switch (wybor) {
                case 1:
                    Console.WriteLine("Stan konta wynosi: " + stan);
                    goto Wprowadz;               
                case 2:
                    Console.WriteLine("Podaj kwotę do pobrania:");
                    double.TryParse(Console.ReadLine(), out kwota);
                    stan -= kwota;
                    goto Wprowadz;  
                case 3:
                    Console.WriteLine("Podaj kwotę do wpłacenia:");
                    double.TryParse(Console.ReadLine(), out kwota);
                    stan += kwota;
                    goto Wprowadz;
                case 4:
                    goto Menu;
                case 5:
                    Console.WriteLine("Koniec działania programu");
                    break;
                default:
                    Console.WriteLine("Nie ma takiej  operacji w menu");
                    goto Menu; 
            }

            Console.ReadLine();

        }
        }

Efekt działania aplikacji:

Rezultat działania aplikacji

Rys. Aplikacja do zarządzania kontem

Do kodu aplikacji dodałem kolejną etykietę o nazwie Wprowadz. Zmieniłem w instrukcji wyboru switch na instrukcję goto aby przeskakiwała do nowo dodanej etykiety. Dodałem także nową opcję, która ma za zadanie wyświetlenie menu, w niej instrukcja goto przeskakuje do etykiety o nazwie Menu. Dzięki temu rozwiązaniu możemy wyświetlić menu wtedy gdy chcemy.

Podsumowanie:
Należy unikać używania polecenia goto. Prawie w każdej sytuacji można go zastąpić. W przypadku dużych projektów zaśmieca ono obraz i czytelność kodu.