Rozdział 8. Instrukcje warunkowe C#

> Dodaj do ulubionych

Dowiedzieliśmy się już niemalże wszystkiego, co trzeba umieć, by zbudować program w języku C#. Możecie być zaskoczeni, lecz samo programowanie poznaliśmy już w naprawdę bardzo dużym stopniu. Pozostała część C# w dużej mierze służy ułatwianiu pracy programisty. Do tej grupy narzędzi należą instrukcje warunkowe C# if i switch.

8.1. Podejmowanie wielu decyzji

Załóżmy, że chcemy udoskonalić nasz kalkulator materiałów okiennych i umożliwić klientowi wybór któregoś spośród zdefiniowanych już okien. Możemy wyświetlić następujące zapytanie:

Podaj rodzaj okna:
1 = angielskie 
2 = standardowe 
3 = drzwi tarasowe

Program obliczy następnie koszt wyprodukowania okna o podanym typie i rozmiarze. Każda metoda zada odpowiednie pytanie i obliczy cenę określonego produktu.

Kod programu będzie mniej więcej wyglądać następująco:

static void handleCasement () 
{
    Console.WriteLine("Obsługa typu angielskie"); 
}
static void handleStandard () 
{
    Console.WriteLine("Obsługa typu standardowe"); 
}
static void handlePatio () 
{
    Console.WriteLine("Obsługa typu drzwi tarasowe"); 
}

To metody, które zajmą się wyliczeniem kosztów produkcji każdego rodzaju okna. Na razie jednak wyświetlają tylko informację o tym, że zostały wywołane. Później uzupełnimy brakujący kod (to tak naprawdę bardzo dobry sposób na budowanie programów). Po dodaniu metod musimy napisać kod wywołujący tę odpowiedzialną za wybrany przez użytkownika rodzaj okna.

Mamy już metodę, za pomocą której możemy pobrać od użytkownika wartość (to metoda readInt przyjmująca łańcuch zapytania oraz najniższą i najwyższą dopuszczalną wartość). Program może więc za jej pośrednictwem wczytać numer wybranej opcji, a następnie wybrać odpowiednią metodę.

8.2. Dokonywanie wyboru — instrukcje warunkowe if

Gdy przyjdzie Wam napisać kod wybierający metodę, to pewnie stworzycie coś takiego:

int selection ; 
selection = readInt ( "Typ okna : ", 1, 3 ) ;
if ( selection == 1 ) 
{
    handleCasement(); 
} 
else 
{
    if ( selection == 2 ) 
    {
        handleStandard();
    }
    else
    {
        if ( selection == 3 ) 
        {
            handlePatio() ; 
        } 
        else 
        {
            Console.WriteLine ( "Nieprawidłowy numer" ); 
        } 
    } 
}

Taki kod zadziała, lecz jest dosyć toporny — do uruchomienia odpowiedniej metody potrzebne są instrukcje warunkowe if.

8.3. Dokonywanie wyboru — instrukcje warunkowe switch

Ponieważ bardzo często musimy dokonywać wyborów, C# zawiera specjalną konstrukcję, która umożliwia wybór jednej opcji z wielu zależnie od podanej wartości. Mowa o instrukcji switch. Oto kod ilustrujący jej użycie w naszym programie:

switch (selection) 
{
    case 1 :
        handleCasement (); 
        break ; 
    case 2 :
        handleStandard () ; 
        break ; 
    case 3 :
        handlePatio () ; 
        break ; 
    default :
        Console.WriteLine ( "Nieprawidłowy numer" ) ; 
        break ; 
}

Przykład 19. Zastosowanie instrukcji warunkowej switch

Instrukcje warunkowe switch przyjmują wartość, na podstawie której decydują, jaką metodę należy wykonać. Instrukcja switch Wybiera ten przypadek (ang. case), którego wartość pokrywa się z tą otrzymaną. Typ używanych przez nas przypadków musi być taki sam jak zmiennej selection, choć jeśli się pomylimy, to kompilator C# tradycyjnie poinformuje nas o wystąpieniu błędu. Znajdująca się po wywołaniu odpowiedniej metody instrukcja break zatrzymuje program i wykonuje następujący po niej kod. Podobnie jak w przypadku pętli, gdy wykonywanie programu dotrze do słowa break, to instrukcja warunkowa switch zostaje zakończona i wykonywana będzie dalsza część programu.

Innym przydatnym elementem jest opcja domyślna, czyli default. Określa kod, który wykona instrukcja warunkowa switch, jeśli wartość nie będzie pasować do żadnego przypadku. W naszym przypadku (wybaczcie!) opcja domyślna zawiera stosowny komunikat.

Konstrukcji switch można używać nie tylko z liczbowymi typami danych:

switch (command) 
{
    case "angielskie" :
        handleCasement (); 
        break ; 
    case "standardowe" :
        handleStandard () ; 
        break ; 
    case "drzwi tarasowe" :
        handlePatio () ; 
        break ; 
    default :
        Console.WriteLine ( "Nieprawidłowe polecenie" ) ; 
        break ; 
}

Instrukcja warunkowa switch dokonuje tutaj wyboru przypadku na podstawie łańcucha. Użytkownicy nie byliby jednak z tego zadowoleni, bo musieliby podać pełną nazwę wybranej opcji, a jakakolwiek literówka sprawiłaby, że polecenie nie zostałoby rozpoznane przez program.

8.3.1. Wiele przypadków

Fragment kodu możemy oznaczyć kilkoma przypadkami — zostanie on wykonany jeśli treść polecenia będzie tożsama z wartością któregokolwiek z kilku przypadków:

switch (command) 
{
    case "angielskie" : 
    case "a" :
        handleCasement (); 
        break ; 
    case "standardowe" : 
    case "s" :
        handleStandard () ; 
        break ; 
    case "drzwi tarasowe" : 
    case "t" :
        handlePatio () ; 
        break ; 
    default :
        Console.WriteLine ( "Nieprawidłowe polecenie" ) ; 
        break ; 
}

Powyższa instrukcja warunkowa switch wybierze daną opcję, jeśli użytkownik wpisze całą nazwę lub tylko jej pierwszą literę. Jeśli chcecie dokonywać wyborów na podstawie łańcuchów w taki właśnie sposób, to polecam zapoznać się z metodami ToUpper i ToLower należącymi do typu string. Można dzięki nim uzyskać łańcuch pisany w całości wielkimi lub małymi literami, co znacznie ułatwia sprawdzanie podanych poleceń:

switch (command.ToUpper()) 
{
    case "ANGIELSKIE" : 
    case "A" : 
    …

Złota myśl programisty: korzystanie z instrukcji switch to dobry pomysł

Dzięki instrukcjom switch program jest czytelniejszy i szybciej się go pisze. Łatwo jest również dodać do nich kolejne polecenie — wystarczy tylko napisać nowy przypadek. Nie polecam jednak umieszczania w tej instrukcji dużych ilości kodu. Zamiast tego należy umieścić odwołanie do metody, tak jak zrobiłem to powyżej.

Autor: Rob Miles

Tłumaczenie: Joanna Liana