Metody
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