Metody
5. Volání metody
Jak již bylo několikrát řečeno, metody je vhodné rozdělit na menší pomocné metody - podprogramy, které postupně budeme volat (spouštět) v rámci rozsáhlejší metody. Tyto pomocné metody nám zejména pomohou tím, že je snadněji můžeme verifikovat (ověřit jejich správnou funkčnost). Zvyšujeme tím také čitelnost zdrojového kódu a usnadňujeme údržbu rozsáhlé metody, která implementuje pomocné metody. Pokud jsme pomocné metody definovali v rámci třídy, mohou být tyto metody zavolány i jinými metodami v rámci této třídy.
Volání metody tedy znamená její spuštění. Metoda je volána jejím názvem. Pokud byla metoda deklarována způsobem, že potřebuje vstupy, musíme ji tyto vstupy naplnit, při jejím volání. Pokud metoda žádný vstup nepotřebuje, nesmíme jí při jejím volání do závorky uvádět jakákoliv data. Obecně lze syntaxi v jazyku C# popsat volání metody následovně:
výsledek = identifikátorMetody(seznamSkutečnýchParametrů);
kde:
- výsledek - je volitelný, nemusí být uveden, např. pokud metoda nenavrací žádný výsledek (je typu void), pak je klauzule výsledek zcela vypuštěna. Je-li výsledek uveden, pak představuje proměnnou, do níž je uložen vrácený výsledek ze zavolané metody. Pokud zavolaná metoda vrací výsledek, ale my bychom klauzuli výsledek neuvedli, vrácený výsledek bude ztracen
- seznamSkutečnýchParametrů - představuje seznam parametrů (argumentů), které mohou do metody vstupovat, ale zároveň i vystupovat. Pokud do metody potřebujeme předat tzv. skutečné parametry, tzn., již skutečné hodnoty předdefinovaných formálních parametrů metody, jejich datové typy musí být shodné s formálními parametry deklarovaných ve volané metodě. Záleží na pořadí předávaných parametrů. Pokud do metody žádný parametr nevstupuje, je uvedena pouze prázdná závorka. Je nutné uvést vždy kulaté závorky, ať už volaná metoda parametry přijímá, či nikoliv
Ilustrativní příklad VolaniMetod
Algoritmus VolaniMetod
- Popis: Vývojový diagram volání podprogramu
- Zadání: Zkuste vymyslet, jak byste zaznamenali v hlavním programu volání podprogramu SectiHodnotyParametru, který bude volán z hlavního programu. Podprogramu předejte 2 vstupy ve formě skutečného parametru a v němž bude uložena hodnota 7 a číselnou hodnotu 5. Výsledek součtu získaný z podprogramu SectiHodnotyParametru uložte do proměnné vysledek. Hodnotu součtu uloženého ve vysledek zobrazte v podprogramu ZobrazHodnotyParametru (tzn. předejte jej jako první parametr) a jako druhý parametr předejte a
- Řešení:
Ve vývojovém diagramu hlavního programu (Main) našeho algoritmu jsme našli značky volání podprogramů - funkce (podprogram s návratem) a procedury (podprogram bez návratu). V případě funkce je ve značce za názvem funkce SectiHodnotyParametru umístěna závorka, která představuje předání hodnot (první hodnota 7 uložená ve skutečném parametru a a druhá hodnota představuje číslo 5) z hlavního programu do formálních parametrů x a y v podprogramu. Jedná se v podstatě o překopírování hodnot - viz Obrázek 1. Návrat (spočtený výstup) funkce je uložen do parametru vysledek.

Obrázek 1: Volání podprogramu SectiHodnotyParametru - 2 vstupy a návrat
Po přiřazení výstupu funkce do parametru vysledek je zavolána procedura ZobrazHodnotyParametru, které předáme z hlavního programu dva parametry - viz Obrázek 2. V parametru vysledek je uložena hodnota 12, tj. 7 + 5 = 12 a v druhém parametru a je uložena hodnota 7. Tyto hodnoty se nakopírují do formálních parametrů x a y procedury a pak je v proceduře necháme společně vypsat, včetně textu definujícího, o který parametr se jedná.

Obrázek 2: Volání podprogramu ZobrazHodnotyParametru - 2 vstupy a žádný výstup
Na základě vývojového diagramu VolaniMetod modifikujeme v konzolové aplikaci hlavní metodu Main, na které si vysvětlíme volání metody s návratem (funkce) a také volání metody bez návratu (procedura) včetně předání parametrů do těchto metod.
Program VolaniMetod_Main- Popis: Volání metod z metody Main
- Zadání: Vymyslete, jak byste v C# naprogramovali v konzolové aplikaci volání metody SectiHodnotyParametru a ZobrazHodnotyParametru v hlavní metodě Main
- Řešení: VolaniMetod_Main
V následujícím kódu v hlavním programu, tedy statické metodě Main zavoláme deklarovanou metodu a předáme jí dvě celočíselné hodnoty 7 uloženou v parametru a a hodnotu 5 – viz Kód 1. Takové formě se zápisu čísla říká literál (nevíme, jestli se jedná o celočíselnou hodnotu 5, nebo reálné číslo 5.0). Později se o literálu dozvíme více. Na druhém řádku našeho kódu v těle metody Main (komentáře nepovažujeme za kód) je uvedena deklarace parametru vysledek. Do tohoto parametru se nám uloží výsledek obdržený ze zavolané statické metody SectiHodnotyParametru. Tuto metodu jsme deklarovali jako statickou, protože jsme ji volali ze statické metody Main, která představuje metodu vykonávanou v programu jako první. Zatím je zbytečné vysvětlovat podstatu modifikátoru přístupu k metodě (jednou možností je použití klíčového slova static), protože jsme se nedostali k definici třídy (statická metoda není závislá na konkrétní instanci třídy, ale přistupujeme k ní v rámci celé třídy). Berme prozatím, že pokud voláme danou metodu ze statické metody Main, musíme označit danou metodu jako statickou klíčovým slovem static). O modifikátoru přístupu se později dozvíme více.
Příkaz Console.ReadKey() zajistí, že program bude čekat, až uživatel stiskne nějakou klávesu. Náš
kompilovaný program by bez tohoto příkazu totiž skončil a my bychom si ani
nestihli přečíst výsledek, pokud by byl v programu vypisován.
static void Main(string[] args) { //Deklarace celočíselných parametrů int a; int vysledek; //Přiřazení hodnoty parametru a = 7; //Zavolání metody se vstupními parametry vysledek = SectiHodnotyParametru(a, 5); //Zavolání metody se vstupy ale bez výstupu ZobrazHodnotyParametru(vysledek, a); //Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); }
Kód 1: Příklad zavolání statických metod se
dvěma vstupními parametry s návratem (funkce SectiHodnotyParametru) a bez návratu (procedura ZobrazHodnotyParametru)
Na následujícím výpisu v konzoli vidíme vypsané hodnoty parametrů, jejichž vypsání se provádí v metodě ZobrazHodnotyParametru – viz Výstup programu - Kód 1.
Hodnota x: 12, y:7
Výstup programu - Kód 1: Ukázka výpisu hodnot parametrů v metodě ZobrazHodnotyParametru
Pokud bychom metodě nepředali žádnou hodnotu,
nebo jen jednu (kterou by si mohla uložit do parametr a dále s ním
pracovat), kompilátor by nám nahlásil chybu „Chybí argument“ a program nebude
spuštěn – viz Kód 2.
//Nelze zavolat metodu pouze s jedním parametrem -> K.O.
vysledek = SectiHodnotyParametru(, 5);Kód 2: Příklad špatného zavolání metody – chybí první parametr
Pro úplnost uveďme zdrojový kód naší dříve deklarované metody SectiHodnotyParametru - viz Kód 3. Tato metoda přijímá vstupní celočíselné parametry
a má celočíselný výstup.
//Deklarace statické metody s celočíselném výstupem a se dvěma vstupními parametry static int SectiHodnotyParametru(int x, int y) { //Deklarace lokální pomocné celočíselné proměnné int z; //součet hodnot parametrů z = x + y; //Návrat - výstup metody je součet hodnot parametrů return z; }
Kód 3: Deklarace metody SectiHodnotyParametru se dvěma vstupními parametry a celočíselným výstupem
Další volanou metodou je ZobrazHodnotyParametru - viz Kód 4. Této metodě pro zobrazení vstupních parametrů x a y jsou předány z hlavní metody Main dva parametry - součet hodnot, tedy 12 uložený v parametru vysledek a parametr a, jehož hodnota je 7.
//Deklarace statické metody bez výstupu se dvěma vstupními parametry static void ZobrazHodnotyParametru(int x, int y) { //Výpis hodnot textu s hodnotami obou parametrů Console.WriteLine("Hodnota x:" + x + ", y:" + y); }
Kód 4: Příklad deklarace metody ZobrazHodnotyParametru bez návratu
výsledku se dvěma vstupními parametry