TOC

This article is currently in the process of being translated into Czech (~82% done).

Základy:

Parametry funkcí

V předchozí kapitole jsme se podívali na funkce. Stručně jsme probrali parametry, ale jen stručně. Zatímco parametry jsou velmi jednoduché a přímočaré použití, existují triky, které je mohou udělat mnohem výkonnější.

The first thing that we will take a look at, is the out and ref modifiers. C#, and other languages as well, differ between two parameters: "by value" and "by reference". The default in C# is "by value", which basically means that when you pass on a variable to a function call, you are actually sending a copy of the object, instead of a reference to it. This also means that you can make changes to the parameter from inside the function, without affecting the original object you passed as a parameter.

Pomocí klíčového slova ref a out, můžeme toto chování změnit, a proto předáváme odkaz na objekt namísto jeho hodnoty.

Modifikátor ref

Promyslete následující příklad:

static void Main(string[] args)
{
    int number = 20;
    AddFive(number);
    Console.WriteLine(number);
    Console.ReadKey();
}

static void AddFive(int number)
{
    number = number + 5;
}

Vytváříme celé číslo, přidělíme mu číslo 20 a pak použijeme metodu AddFive (), která má přidat číslo 5. Udělá to? Ne. Hodnota, kterou přidělíme číslu uvnitř funkce, se nikdy neprovede z funkce, protože jsme místo odkazu na ni předali kopii hodnoty čísla. To je prostě to, jak C # funguje, a v mnoha případech je to preferovaný výsledek. V tomto případě však chceme číslo uvnitř naší funkce změnit. Zadejte klíčové slovo ref:

static void Main(string[] args)
{
    int number = 20;
    AddFive(ref number);
    Console.WriteLine(number);
    Console.ReadKey();
}

static void AddFive(ref int number)
{
    number = number + 5;
}

Jak vidíte, vše co jsme udělali bylo, že bylo přidáno klíčové slovo ref do funkce prohlášení, stejně jako funkce volání. Pokud nyní spustíte program, uvidíte, že hodnota čísla se nyní změnila, jakmile se vrátíme z volání funkce.

Modifikátor out

Out modifikátor funguje do značné míry jako modifikátor ref. Oba zajišťují, že parametr je předáván odkazem namísto hodnotou,ale přichází s dvěma důležitými rozdíly: Hodnota předaná modifikátoru ref musí být inicializována před voláním metody - to není pravda pro modifikátor out, kde můžete použít neinicializované hodnoty. Na druhou stranu nemůžete ponechat volání funkce s parametrem out, aniž byste ji přidělili hodnotu. Vzhledem k tomu, že můžete zadat neinicializované hodnoty jako parametr Out, nemůžete skutečně použít parametr uvnitř funkce - můžete mu přiřadit pouze novou hodnotu.

Zda použít "out" nebo "ref" opravdu závisí na situaci a to si uvědomíte, jakmile je začnete používat. Obě se obvykle používají k řešení problému kdy je možné vrátit jednu hodnotu z funkce pomocí funkce C #.

Použití modifikátoru out je stejně jako použití modifikátoru ref, jak je uvedeno výše. Jednoduše změňte klíčové slovo ref na klíčové slovo out. Ve výše uvedeném příkladu a také nezapomeňte odebrat hodnotu přiřazenou číslu v metodě a místo toho deklarovat funkci volání.

The params modifier

Všechny naše funkce zatím přijaly pevné množství parametrů. V některých případech však budete potřebovat funkci, která má libovolný počet parametrů. To by samozřejmě mohlo být provedeno přijetím pole nebo seznamu jako parametru, jako je tento:

static void GreetPersons(string[] names) { }

Volání by však bylo trochu nemotorné. V nejkratší podobě by to vypadalo takto:

GreetPersons(new string[] { "John", "Jane", "Tarzan" });

Je to přijatelné, ale lze to udělat i chytřejší a to s klíčovým slovem params:

static void GreetPersons(params string[] names) { }

Volání by pak vypadalo takto:

GreetPersons("John", "Jane", "Tarzan");

Další výhodou použití parametru params je, že do něj můžete také přenést nulové parametry. Funkce s parametry mohou mít i jiné parametry, pokud je parametr s klíčovým slovem params poslední. Kromě toho lze pro každou funkci použít pouze jeden parametr používající klíčové slovo params. Zde je poslední a další úplný příklad:

static void Main(string[] args)
{
    GreetPersons(0);
    GreetPersons(25, "John", "Jane", "Tarzan");
    Console.ReadKey();
}

static void GreetPersons(int someUnusedParameter, params string[] names)
{
    foreach(string name in names)
Console.WriteLine("Hello, " + name);
}
This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!