Instrukcja wyboru switch ma za zadanie sprawdzenie wartości zmiennej, a następnie wykonanie odpowiedniego bloku kodu. Zobaczmy przykładową konstrukcję warunkową switch:

  class Program {
        static void Main() {
            int zmienna;
            zmienna = 1;
            switch (zmienna) {
                case 1:
                    Console.WriteLine("Zmienna ma wartość 1");
                    Console.WriteLine("Wykonuje dodatkowe operacje......");
                    break;
                case 2:
                    Console.WriteLine("Zmienna ma wartość 2");
                    Console.WriteLine("Wykonuje dodatkowe operacje......");
                    break;
                default:
                    Console.WriteLine("Wynowuje operacje");
                    break;
            }
            Console.ReadLine();

        }
}

Rezultat działania aplikacji:

Rezultat działania aplikacji

Rys. Rezultat działania aplikacji

Najpierw deklaruje zmienną, której wartość będzie sprawdzać instrukcja wyboru switch. Następnie przypisuje dla niej wartość tak, aby można było przetestować działanie aplikacji. W konstrukcji switch po słowie kluczowym case podajemy wartość zmiennej dla której wykona się blok kodu. Słowo kluczowe break służy do zakończenia działania bloku kodu. Słowa kluczowego deflaut używamy gdy chcemy aby wykonały się instrukcje w przypadku gdy wartość sprawdzanej zmiennej przez instrukcję switch będzie spoza zakresu sprawdzanego przez instrukcje case. Czyli gdy zmienna przyjmie wartość dla której nie napisana została instrukcja case wykona się kod z bloku deflaut.

Oczywiście możemy sprawdzać zmienne dowolnego typu nie tylko int. Przykład:

 class Program {
        static void Main() {
            string imie;
            imie = "Test";
            switch (imie) {
                case "Darek":
                    Console.WriteLine("Mam na imię Darek");
                    Console.WriteLine("Wykonuje dodatkowe operacje......");
                    break;
                case "Ewelina":
                    Console.WriteLine("Mam na imię Ewelina");
                    Console.WriteLine("Wykonuje dodatkowe operacje......");
                    break;
                default:
                    Console.WriteLine("Wybrano inne imię");
                    Console.WriteLine("Wynowuje operacje");
                    break;
            }
            Console.ReadLine();

        }
    }

Rezultat działania aplikacji:

Rezultat działania aplikacji

Rys. Wyświetlenie komunikatu z bloku deflaut

W tym przykładzie zadeklarowałem zmienną typu string o nazwie imię. Nadałem jej wartość wynoszącą ”Test”. W instrukcji wyboru switch nie znajduje się instrukcja case, która wykonywałaby blok kodu dla wartości, którą zainicjowałem dla zmiennej o nazwie imię przez co wykonał się kod z bloku deflaut.

Do zakończenia działania instrukcji case oprócz słowa kluczowego break, możemy użyć goto lub return. Ich działanie opiszę w kolejnych wpisach.

Instrukcję wyboru switch możemy zastąpić instrukcją warunkową if.

Przykład:

Napiszę najpierw aplikację wykorzystującą instrukcję wyboru 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ę, tym problemem zajmiemy się w następnym wpisie.

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:

Rezultat działania aplikacji

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

W aplikacji do wyboru opcji wybrałem zmienną typu int. Dzięki czemu wybieramy operację za pomocą liczby. Stan konta jest typu double ponieważ możemy wypłacić lub wpłacić kwotę na konto o wartości zmiennoprzecinkowej. Do konwersji wartości w tej aplikacji używam metod TryParse().Gdy użytkownik jako numer operacji wpisze dowolne znaki z klawiatury nie będące liczbą metoda TryParse() zwróci wartość 0 przez co wykona się w switch instrukcja deflaut. W przypadku operacji używających zmienną typu double o nazwie kwota sytuacja jest podobna gdy użytkownik wpisze wartość nie będąca liczbą zmiennoprzecinkową metoda TryParse() oczywiście zwróci wartość 0 przez co wykonana operacja wypłaty lub wpłaty nie zmieni wartości zmiennej stan.

Przerobię teraz program aby korzystał z instrukcji warunkowej if:

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);

            if (wybor == 1) {
                Console.WriteLine("Stan konta wynosi: " + stan);
            } else if (wybor == 2) {
                Console.WriteLine("Podaj kwotę do pobrania:");
                double.TryParse(Console.ReadLine(), out kwota);
                stan -= kwota;
            } else if (wybor == 3) {
                Console.WriteLine("Podaj kwotę do wpłacenia:");
                double.TryParse(Console.ReadLine(), out kwota);
                stan += kwota;
            } else if (wybor == 4) {
                Console.WriteLine("Koniec działania programu");
            } else {
                Console.WriteLine("Nie ma takiej operacji w menu");
            }

            Console.ReadLine();

        }
    }

Rezultat działania aplikacji jest identyczny. Jednak kod z zastosowaniem instrukcji warunkowej if jest mniej czytelny oraz mniej wydajny.

Podsumowanie:

Instrukcję wyboru switch używamy wtedy gdy chcemy wykonać operacje w zależności od wartości zmiennej. Natomiast gdy chcemy sprawdzić poprawność warunku korzystamy z instrukcji warunkowej if. Oczywiście instrukcję wyboru switch możemy zastąpić instrukcją warunkową if jednak taki kod jest mniej czytelny oraz mniej wydajny.