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