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.