This article has been localized into Czech by the community.
Dynamický typ
Ve verzi C# 4.0 představila společnost Microsoft nový typ: dynamic. Ve skutečnosti jde o statický typ, ale na rozdíl od ostatních statických typů nejsou (potenciální) členové dynamického objektu kontrolováni kompilátorem. To vám poskytne některé výhody dynamicky/slabě typovaných jazyků, přičemž v ostatních případech si zachová výhody silně typovaného jazyka.
Deklarace dynamické proměnné je jako deklarace jakéhokoli jiného typu - jednoduše použijte klíčové slovo dynamic místo datového typu:
dynamic d1;
dynamic d2 = "A string";
dynamic d3 = 42;
Nyní máte tři různé objekty - první v tuto chvíli opravdu nic není (null), zatímco druhý je řetězec a třetí celé číslo. Interpret to automaticky rozhodne za běhu na základě toho, co proměnným přiřadíte. To také znamená, že kompilátor nebude kontrolovat, co s těmito proměnnými děláte, jak je ilustrováno v následujícím příkladu:
dynamic d1;
dynamic d2 = "A string";
dynamic d3 = 42;
Console.WriteLine(d2.Length);
Console.WriteLine(d3.Length);
Řetězce mají vlastnost délky, která určuje, jak dlouhý řetězec je, ale celé číslo ne. V tomto případě se pokusím použít tuto vlastnost na obou proměnných, a kompilátor nebude mít námitky - pokud by tyto proměnné byly deklarovány jako řetězec a celé číslo, kompilátor by to zastavil. Ale protože typy jsou dynamické, prostě to zkompiluje a spustí. Jakmile však interpret dosáhne posledního řádku, bude vyhozena výjimka, protože samozřejmě nemůžete přistupovat k vlastnosti, která neexistuje.
To také ukazuje nebezpečí dynamických typů - musíte si být vědomi toho, co děláte, a ujistit se, že každou vlastnost a volání metody správně napíšete, protože kompilátor vaši práci nebude dvojitě kontrolovat, což vám v podstatě umožní publikovat kód, který pokaždé selže.
Dynamický objekt
Klíčové slovo dynamic lze samozřejmě použít pro složitější typy, než jsou celá čísla a řetězce. Skvělým příkladem toho je, když se používá k držení anonymního objektu, jako v tomto případě:
dynamic user = new
{
Name = "John Doe",
Age = 42
};
Console.WriteLine(user.Name + " is " + user.Age + " years old");
To vám umožňuje vytvořit objekt bez nutnosti nejprve definovat pro něj třídu. Klíčové slovo dynamic ho může držet, ale stejně tak ho může držet klíčové slovo var, které může být v mnoha situacích lépe vhodné.
Můžete si myslet, že typ je dynamický, tak k němu můžete později jednoduše přidávat vlastnosti, jako v tomto případě:
dynamic user = new
{
Name = "John Doe",
Age = 42
};
user.HomeTown = "New York";
Protože u dynamického typu se neprovádí kontrola v době kompilace, tento kód se skutečně spustí, protože kompilátor ve skutečnosti neověřuje existenci vlastnosti HomeTown, ale jakmile je dosaženo posledního řádku, bude vyhozena výjimka. Ačkoli je dynamický typ velmi dynamický, neumožňuje vám dynamicky přidávat nové vlastnosti. Pro to můžete použít ExpandoObject, o kterém budeme diskutovat v dalším článku.
Změna typu
Proměnná deklarovaná jako dynamická vůbec není bez typu. Místo toho ji C# interně bude ošetřovat jako jakýkoli typ objektu, který jste jí přiřadili. V našem prvním příkladu uvidíte, jak můžeme deklarovat proměnnou jako dynamickou, přiřadit jí buď řetězec nebo celé číslo, a pak začít používat vlastnosti patřící těmto typům. Typ dynamické proměnné můžete však snadno změnit - stačí jí přiřadit novou hodnotu. Zde je příklad:
dynamic user = new
{
Name = "John Doe",
Age = 42
};
Console.WriteLine(user.GetType() + ": " + user.Name + " is " + user.Age + " years old");
user = "Jane Doe";
Console.WriteLine(user.GetType() + ": String.Length = " + user.Length);
Všimněte si, jak používáme dynamickou proměnnou user: Nejprve obsahuje anonymní objekt a poté mu místo toho přiřadíme jednoduchý řetězec. Ověřujeme to pomocí metody GetType(), která se nachází na všech objektech C#, a v obou případech přistupujeme k vlastnostem nalezeným na typu, který právě máme (nejprve vlastnosti Name/Age anonymního objektu, poté vlastnost Length nalezenou na objektech řetězce).
Shrnutí
Klíčové slovo dynamic umožňuje používat proměnné, které nejsou specifické pro typ - místo toho se chovají jako druh dat, která obsahují. Dynamické proměnné můžete snadno přiřadit novou hodnotu, a pokud typ hodnoty, kterou přiřazujete, není stejný jako typ, který aktuálně drží, dynamická proměnná jednoduše automaticky změní typ.
Dynamické proměnné nejsou kompilátorem kontrolovány, což vám umožňuje přistupovat k vlastnostem, které mohou nebo nemusí být přítomny. To je činí velmi flexibilními, ale také to činí vaše aplikace mnohem zranitelnějšími vůči chybám. Zvláště z tohoto důvodu můžete chtít omezit použití klíčového slova dynamic na situace, kdy bez jeho použití nemůžete dosáhnout toho, co chcete. Příklady situací, kdy má smysl používat klíčové slovo dynamic, jsou pro interoperabilitu s COM a při interakci s formáty dat jako je JSON a XML.