7. Předání parametru

7.1. Parametry předávané hodnotou

Při předání skutečného parametru metodě hodnotou je jeho odpovídající formální parametr inicializován kopií tohoto vstupního argumentu metody. To platí bez ohledu na to, zda je parametrem hodnotový typ (například int), prázdný – nulovatelný (null) - typ, nebo jako referenční typ (forma odkazu). O hodnotových a referenčních typech se více dozvíme později. 

Pokud bychom chtěli předat metodě (v tomto případě funkci) jeden parametr hodnotou, mohla by deklarace metody vypadat následovně:

návratovýDatovýTyp identifikátorMetody(datovýTyp formálníParametr)
{
     //Tělo metody - zde jsou umístěny příkazy oddělené středníkem
     return výstup;
}

kde:

  • datovýTyp - datový typ formálního parametru metody
  • formálníParametr - identifikátor formálního parametru metody. Tento datový typ musí být vždy určen. Pokud do metody vstupuje více parametrů, každý parametr má svůj datový typ uváděný před identifikátorem (názvem) parametru. Tyto parametry, jsou od sebe odděleny čárkami
  • návratovýDatovýTyp, identifikátorMetody, Tělo metody, return, výstup - popsáno v předchozích kapitolách

Pro případ metody, která nenavrací žádný výsledek, místo návratového datového typu píšeme klíčové slovo void.

Syntaxe předání parametru hodnotou v případě volání metody vypadá:

výsledek = identifikátorMetody(seznamSkutečnýchParametrů);

kde

  • seznamSkutečnýchParametrů - představuje seznam skutečných parametrů (argumentů), které mohou do metody pouze vstupovat (již nevystupují z metody). U skutečných parametrů se v závorce neuvádí ve volání metody jejich datový typ. Hodnoty skutečných parametrů metody musí být shodné s datovými typy formálních parametrů 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
  • výsledek, identifikátorMetody - popsáno v předchozích kapitolách

V případě volání metody bez návratu (procedury) by odpadla levá strana od operátoru přiřazení včetně tohoto operátoru.


Předání hodnotou znamená, že je nemožné, aby jakákoli změna formálního parametru provedená uvnitř metody ovlivnila hodnotu skutečného parametru

Na místě formálního parametru, volaného hodnotou, může být jako skutečný parametr výraz stejného typu jako má formální parametr (konstanta, proměnná, výraz s operátory, které daný typ připouští a metoda, vracející hodnotu stejného datového typu). Naopak, hodnotou nemůže být volán parametr takového datového typu, kde neexistuje hodnota. Takový parametr musí být vždy předán odkazem.


Ilustrativní příklad InkrementaceParametruHodnotou
Program InkrementaceParametruHodnotou
  • Popis: Deklarace metody s celočíselným parametrem – předání parametru hodnotou
  • Zadání: Vymyslete, jak byste v C# naprogramovali podprogram InkrementaceParametruHodnotou jako konzolovou aplikaci. Metoda přijímá celočíselný parametr pojmenovaný formalniParametr, který je předán hodnotou. V těle metody se k tomuto parametru přičte hodnota 1. Hodnotu parametru vypište jak v deklarované metodě, tak i v metodě Main.
  • Řešení: Bude postupně probráno v následujícím textu

Následující příklad osvětluje princip, který jsme vysvětlili v předchozím odstavci. Deklarovali jsme statickou metodu InkrementaceParametruHodnotou, která bude zavolána ze statické metody Main. Metoda InkrementaceParametruHodnotou pouze přičte k formálnímu parametru hodnotu 1. V metodě necháme vypsat aktuálního hodnotu formálního parametru – viz Kód 1.

/*Deklarace statické metody s jedním celočíselným formálním parametrem -
  předání parametru hodnotou*/
static void InkrementraceParametruHodnotou(int formalniParametr)
{
    //Inkrementace parametru o hodnotu 1
    formalniParametr++;
    //Výpis aktuálního hodnoty argumentu
    Console.WriteLine("Formální parametr: {0}", formalniParametr);
}

Kód 1: Příklad deklarace metody InkrementaceParametruHodnotou s celočíselným parametrem – předání parametru hodnotou

V metodě Main zavoláme vytvořenou metodu InkrementaceParametruHodnotou - viz Kód 2. V metodě Main necháme vypsat aktuální hodnotu skutečného parametru. Po vypsání obou hodnot parametrů zjistíme, zda hodnota skutečného parametru v metodě Main byla změněna, či nikoliv.

static void Main(string[] args)
{
    //Deklarace skutečného parametru, tj. argument volané metody
    int skutecnyParametr = 7;
    /*Zavolání statické metody bez výstupu a předání skutečného parametru hodnotou/
    InkrementraceParametruHodnotou(skutecnyParametr);
    //Výpis aktuálního hodnoty skutečného parametru
    Console.WriteLine("Skutečný parametr: {0}", skutecnyParametr);
    //Čekání na stisk klávesy -> ukončení programu
    Console.ReadKey();
}

Kód 2: Příklad zavolání metody InkrementraceParametruHodnotou, do níž byl parametr předán hodnotou

Na základě výpisu v konzole vidíme, že pokud jsme předali parametr hodnotou, hodnota skutečného parametru nebyla v metodě Main změněna - viz Výstup programu - Kód 2.

Formální parametr: 8
Skutečný parametr: 7

Výstup programu - Kód 2: Ukázka výsledku předání parametru hodnotou