poniedziałek, 05 października 2015

Instrukcja switch

"Przełącznik", czyli instrukcja switch, jest kontynuacją wcześniejszej notatki odnoszącej się do instrukcji sterujących. Polecenie switch stanowi alternatywę dla kaskadowej instrukcji if, z tą różnicą, że określenie ścieżki odbywa się na podstawie wartości jednej zmiennej.

Kod poniżej nawiązuje do wcześniejszego wpisu Instrukcje sterujące, w którym pytaliśmy o liczbę lat programowania w C#. W tym przykładzie, zamiast podawać dokładną liczbę, ograniczamy się do słownego określenia długości.

using System;

namespace HelloWorld
{
    public static class Program
    {
        public static void Main()
        {
            Console.WriteLine("How long have you been programming in C#?");
            Console.WriteLine("Choose: long, medium, short or any.");

            string inputText = Console.ReadLine();

            switch (inputText)
            {
                case "long":
                    Console.Write("You're a seasoned programmer.");
                    break;

                case "medium":
                    Console.Write("You're gaining experience.");
                    break;

                case "short":
                    Console.Write("You are a novice programmer.");
                    break;

                case "any":
                    Console.Write("Give it a try, it's really cool.");
                    break;
            }

            Console.ReadKey();
        }
    }
}

Składnia instrukcji switch rozpoczyna się od słowa kluczowego, a w nawiasach umieszczony jest warunek wejścia w konkretną sekcję. Warunek może przyjąć wartość typu: bool, int, char, string lub typu wyliczeniowego. Instrukcja ograniczona jest parą nawiasów klamrowych, wewnątrz których znajduje się seria sekcji case, definiujących operacje dla danej wartości. Każda z sekcji zakończona jest słowem kluczowym break, które jest obowiązkowe i powoduje wyjście z instrukcji. Alternatywnie blok sekcji można zakończyć wyjściem z metody za pomocą słowa kluczowego return, rzucając wyjątek lub korzystając z goto case.

Instrukcja umożliwia zdefiniowanie sekcji default, do której przejdziemy, gdy żadna z wartości nie spełni warunku. Poniżej przykład z użyciem tej sekcji.

using System;

namespace HelloWorld
{
    public static class Program
    {
        public static void Main()
        {
            Console.WriteLine("How long have you been programming in C#?");
            Console.WriteLine("Choose: long, medium, short or any.");

            string inputText = Console.ReadLine();

            switch (inputText)
            {
                case "Long":
                case "long":
                    Console.Write("You're a seasoned programmer.");
                    break;

                case "Medium":
                case "medium":
                    Console.Write("You're gaining experience.");
                    break;

                case "Short":
                case "short":
                    Console.Write("You are a novice programmer.");
                    break;

                case "Any":
                case "any":
                    Console.Write("Give it a try, it's really cool.");
                    break;

                default:
                    Console.Write("Invalid input.");
                    break;
            }

            Console.ReadKey();
        }
    }
}

W przykładzie rozszerzyliśmy sekcje o drugą wartość zaczynającą się wielką literą, aby obsłużyć obie formy pisowni. "Lepszym" rozwiązaniem byłoby użycie metody ToUpper na zmiennej inputText, co uczyni kod odpornym na różne formy pisowni wprowadzane przez użytkownika. Poniżej zmodyfikowany kod z wykorzystaniem tej metody.

using System;

namespace HelloWorld
{
    public static class Program
    {
        public static void Main()
        {
            Console.WriteLine("How long have you been programming in C#?");
            Console.WriteLine("Choose: long, medium, short or any.");

            string inputText = Console.ReadLine();

            switch (inputText.ToUpper())
            {
                case "LONG":
                    Console.Write("You're a seasoned programmer.");
                    break;

                case "MEDIUM":
                    Console.Write("You're gaining experience.");
                    break;

                case "SHORT":
                    Console.Write("You are a novice programmer.");
                    break;

                case "ANY":
                    Console.Write("Give it a try, it's really cool.");
                    break;

                default:
                    Console.Write("Invalid input.");
                    break;
            }

            Console.ReadKey();
        }
    }
}

W C# nie ma automatycznego "przechodzenia" przez sekcje, jak w C. Każda sekcja musi być zakończona break, chyba że używamy goto case. Instrukcja goto case pozwala na wyraźne zadeklarowanie "przejścia" do innej sekcji.

using System;

namespace HelloWorld
{
    public static class Program
    {
        public static void Main()
        {
            string inputText = Console.ReadLine();

            switch (inputText)
            {
                case "one":
                    Console.Write("one");
                    break;

                case "two":
                    Console.Write("two");
                    goto case "one";
            }

            Console.ReadKey();
        }
    }
}

Po przeczytaniu tej oraz wcześniejszej notatki powinniśmy wiedzieć, jak korzystać z instrukcji sterujących, w tym z switch. Przed nami zasady działania pętli, o których możesz przeczytać tutaj.

Troska Robert