V posledním dílu tohoto seriálu jsme prozkoumali klíčové slovo dynamic a jaké možnosti nám nabízí. Dnes budeme v nových vlastnostech jazyka pokračovat a podíváme se na tzv. pojmenované a volitelné parametry.
reklama
V posledním dílu tohoto seriálu jsme prozkoumali klíčové slovo dynamic a jaké možnosti nám nabízí. Dnes budeme v nových vlastnostech jazyka pokračovat a podíváme se na tzv. pojmenované a volitelné parametry.
Většina dnešních moderních a používaných jazyků přiřazuje hodnoty do vstupních parametrů funkce podle pořadí, v jakém jsou zapsány při volání funkce resp. v signatuře funkce. Ve velkém množství případů je toto bez problému. Zlom však nastane v případě, že chcete jeden nebo více parametrů vynechat nebo je zapisovat v jiném pořadí (které např. lépe vystihuje, co do funkce předáváte). A nejen to. U některých funkcí nemusí být z parametrů zřejmé, který co představuje. Pokud parametry pojmenujete, i při pouhém čtení v „obyčejném“ editoru je vše zřetelnější.
Představme si jednoduchou funkci:
static void SimpleForLoop(Action<int> action, int start, int end)
{
for (int i = start; i < end; i++)
{
action(i);
}
}
Většinou pro smyčku specifikujeme nejprve spodní a horní hranice a poté píšeme tělo. Tato funkce je definována opačně, což může způsobovat zbytečnou nečitelnost a případně i rozčarování, jestli i parametry start a end nejsou náhodou prohozeny (vše pozpátku). V C# 4 však můžeme parametry libovolně přeházet a explicitně říci, který je který.
SimpleForLoop(start: 0, end: 10, action: (i) => { });
Žádné velké změny v syntaxi. Jen je před hodnotou uveden název parametru, oddělen dvojtečkou. Věřím, že tato nová vlastnost není pomyslná killer-feature, avšak teprve ve spojení s druhou vlastností – volitelnými parametry – dostane tu správnou barvu.
Často máte ve své třídě funkci, která bere několik parametrů, ale některé z nich jednoduše nevyžaduje, neboť nejsou dále povinné, případně jsou pro ně definovány vyhovující standardní hodnoty. V „dřevních“ dobách se toto řešilo formou několika funkcí, které braly různé sady parametrů a volaly pak „tu největší“ se všemi parametry, s přidáním implicitních hodnot pro chybějící. Žel tento způsob někdy nutil vytvářet zbytečně mnoho metod pro různé kombinace parametrů.
S novými volitelnými parametry C# 4 máte tento problém částečně vyřešen. Volitelné parametry musí být přirozeně voleny od konce definice funkce, podobně jako např. při použití klíčového slova params, pro zachování deterministického výběru.
Modifikujme lehce naši funkci:
static void SimpleForLoop(Action<int> action, int start = 0, int end = 99)
{
for (int i = start; i < end; i++)
{
action(i);
}
}
Implicitní hodnoty parametrů se specifikují za názvem parametru oddělené rovnítkem. Analogicky jako v mnoha jiných jazycích (např. PHP). Volání je pak beze změny (pouze je možné některé parametry vynechat).
SimpleForLoop(action: (i) => { });
SimpleForLoop((i) => { });
Možná vás nyní napadá, co se stane, pokud chci specifikovat pouze parametr end a start nechat na implicitní hodnotě. Parametry se budou hledat zprava a naneštěstí oba dva jsou int, takže volání bude i validní. Odpovědí jsou, jak jistě tušíte, pojmenované parametry.
SimpleForLoop(action: (i) => { }, end: 10);
Kruh se nyní uzavřel a vidíme, proč jsou pojmenované parametry mj. zavedeny. S volitelnými parametry však také souvisí jedno riziko. Mohli byste si myslet, že jejich hodnota je uložena společně s definicí funkce a v tomto místě také dosazena. Bohužel to není tak jednoduché. A hodnoty se dostávají i blíže k volajícímu. Výsledek po použití nové verze knihovny by pak mohl někoho nemile překvapit. Více informací můžete najít v článku Nepovinné parametry v C# 4.0 – používat opatrně.
Nových funkcí není nikdy dost. A jak uvidíme v příštích dílech, volitelné a pojmenované parametry společně s typem dynamic utvoří ještě větší kruh.