7. Předání parametru

7.3. Výstupní parametry

Pokud předáváme parametr odkazem, kompilátor zkontroluje, zda byla skutečnému parametru přiřazena hodnota. Pokud tomu tak není, zdrojový kód není zkompilován. Co když ale potřebujeme v nějaké metodě inicializovat parametr. Pro tento případ jazyk C# nabízí možnost použít tzv. výstupní parametr pomocí klíčového slova out (zkratka anglického „Output“), 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ě (syntaxe je tedy podobná klíčovému slovu ref). Jde tedy o využití reference, tj. propojení skutečného a formálního parametru pomocí reference (odkaz na stejné místo v paměti). V těle volané metody musí před jejím ukončením proběhnout inicializace formálního parametru (pokud tomu tak není, neproběhne kompilace kódu)! Výstupní parametr lze využít i u metody s návratem, ale je spíše využit u metody bez návratu (procedury):

void identifikátorMetody(out datovýTyp formálníParametr)
{
     //Tělo metody - musí proběhnout inicializace výstupního parametru
}

kde:

  • out - 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 výstupního formálního parametru metody
  • formálníParametr - identifikátor výstupního 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 spolu s klíčovým slovem out. Tyto parametry, jsou od sebe odděleny čárkami
  • Tělo metody - v těle metody musí proběhnout inicializace (přiřazení hodnoty) výstupního formálního parametru
  • návratovýDatovýTyp, identifikátorMetody, return, výstup - popsáno v předchozích kapitolách

Syntaxe volání metody bez návratu (procedury) u výstupního parametru vypadá syntaxe následovně:

identifikátorMetody(out skutečnýParametr);

kde

  • out - klíčové slovo - slouží pro vytvoření odkazu na skutečné místo uložení hodnoty parametru v paměti
  • identifikátorMetody, skutečnýParametr- popsáno v předchozích kapitolách

Ilustrativní příklad InicializaceVystupnihoParametru 
Program InicializaceVystupnihoParametru
  • Popis: Příklad deklarace metody s celočíselným parametrem – výstupní parametr
  • Zadání: Zkuste deklarovat metodu bez návratu nazvanou InicializaceVystupnihoParametru, která inicializuje výstupní celočíselný parametr pojmenovaný formalniParametr hodnotou 7. Hodnotu parametru vypište jak v deklarované metodě, tak i v metodě Main, ze které je metoda volána
  • Řešení: Bude postupně probráno v následujícím textu

Následující příklad ilustruje princip použití výstupního parametru – viz Kód 1. Deklarovali jsme statickou metodu bez návratu (proceduru) InicializaceVystupnihoParametru, která bude zavolána ze statické metody Main. Metoda InicializaceVystupnihoParametru ve svém těle metody formálnímu parametru počáteční hodnotu 7. V metodě necháme vypsat aktuálního hodnotu formálního parametru. Je důležité zmínit fakt, že se jedná o propojení skutečného a formálního parametru pomocí reference (odkazu). Pokud tedy něco provádíme s formálním parametrem, tyto změny jsou promítány i do skutečného parametru.

/*Deklarace statické metody s jedním celočíselným formálním parametrem -
  použití výstupního parametru*/
static void InicializaceVystupnihoParametru(out int formalniParametr)
{
    //Inicializace parametru
    formalniParametr = 7;
    //Výpis aktuálního hodnoty argumentu
    Console.WriteLine("Formální parametr: {0}", formalniParametr);
}

Kód 1: Příklad deklarace metody InicializaceVystupnihoParametru s celočíselným parametrem – výstupní parametr

V metodě Main zavoláme vytvořenou metodu InicializaceVystupnihoParametru, která nám do skutečného parametru přiřadí inicializovanou hodnotu uloženou ve formálním parametru - viz Kód 2. V metodě Main necháme vypsat aktuální hodnotu skutečného parametru. Vzhledem k tomu, že jsme v metodě kromě inicializace neprováděli žádné další operace s formálním parametrem, hodnota skutečného parametru a formálního parametru je stejná.

static void Main(string[] args)
{
    //Deklarace skutečného parametru, tj. argument volané metody
    int skutecnyParametr;
    //Zavolání statické metody bez návratu ve které proběhne inicializace parametru
    InicializaceVystupnihoParametru(out 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 InicializaceVystupnihoParametru s výstupním parametrem

Na základě výpisu v konzole vidíme, že pokud vypsaná hodnota výstupního parametru v deklarované metodě je stejná jako hodnotou skutečného parametru v metodě Main, protože jsme neprováděli žádnou aritmetickou operaci - viz Výstup programu - Kód 2.

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

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