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


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. 

Volání podprogramu SectiHodnotyParametru - 2 vstupy a návrat

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á.

Volání podprogramu ZobrazHodnotyParametru - 2 vstupy a žádný výstup

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