7. Předání parametru

7.2. Parametry předávané odkazem

Někdy však potřebujeme, aby každá změna argumentu provedená ve volané metodě se promítla i vně volané metody. Tehdy můžeme využít způsob předání parametru odkazem pomocí klíčového slova ref (zkratka anglického slova „Reference“), které umístíme před skutečný parametr u volání metody, tak i před datový typ u formálního parametru v deklarované metodě. 

Při předávání parametrů odkazem je metodě předána adresa (tzv. odkaz na místo hodnoty uložené v paměti), kde se daná proměnná nachází. Metoda provádí úkony přímo s tímto argumentem, a proto může být použita jak pro vstup do metody, tak i pro výstup změněného argumentu z metody.

Skutečným (aktuálním) parametrem může být jen jméno proměnné, nelze použít konstantu, výraz a výsledek funkce.

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

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

kde:

  • ref - klíčové slovo - slouží pro vytvoření odkazu na skutečné místo uložení hodnoty parametru v paměti (vytvoření odkazu - aliasu - na skutečný parametr, tzn. že každá operace provedená s parametrem je provedena na argumentu - skutečném parametru)
  • 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 odkazem v případě volání metody vypadá:

výsledek = identifikátorMetody(ref skutečnýParametr);

kde

  • ref - klíčové slovo - slouží pro vytvoření odkazu na skutečné místo uložení hodnoty parametru v paměti
  • skutečnýParametr - představuje skutečný parametr (argument), který může do metody jak vstupovat tak i vystupovat - v metodě lze nad ním provádět operace, které se budou odrážet na jeho hodnotě. Pokud je skutečných parametrů více, jednotlivé parametry jsou odděleny čárkou a v závorce za voláním metody se neuvádí  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.

Ilustrativní příklad InkrementaceParametruOdkazem
Program InkrementaceParametruOdkazem
  • Popis: Deklarace metody s celočíselným parametrem – předání parametru odkazem
  • Zadání: Zkuste deklarovat metodu bez návratu (proceduru) nazvanou InkrementaceParametruOdkazem, která přijímá celočíselný parametr pojmenovaný formalniParametr, který je předán odkazem. 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 implementuje princip předání parametru odkazem. Deklarovali jsme statickou metodu InkrementaceParametruOdkazem, která bude zavolána ze statické metody Main. Metoda InkrementaceParametruOdkazem pouze k formálnímu parametru předaného odkazem přičte 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 odkazem*/
static void InkrementraceParametruOdkazem(ref 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 InkrementraceParametruOdkazem s celočíselným parametrem – předání parametru odkazem

V metodě Main zavoláme vytvořenou metodu InkrementaceParametruOdkazem - viz Kód 2. V metodě Main necháme vypsat aktuální hodnotu skutečného parametru. Po vypsání obou hodnoty 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 návratu a předání skutečného parametru odkazem
     InkrementraceParametruOdkazem(ref 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 InkrementraceParametruOdkazem, do níž byl parametr předán odkazem

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

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

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