Referenční typy - třída
10. Anonymní třída
Anonymní třída je třída, která nemá jméno. Sice to může znít zvláštně, ale tento typ třídy je využíván u dotazových výrazů. Anonymní třída se vytváří pomocí klíčového slova new a do složených závorek se umístí definice datových složek a jejich hodnot. U anonymních tříd platí následující pravidla:
- Anonymní třídy musí obsahovat pouze veřejné datové složky
- Datové složky musí být inicializované
- Datové složky nesmí být statické a nelze specifikovat metody [6]
Ilustrativní příklad AnonymniTrida
Program AnonymniTrida- Popis: Deklarace anonymní třídy, vytvoření instance, výpis datových složek
- Zadání: Deklarujte anonymní třídu se dvěma datovými složkami - Jmeno (textový řetězec) a Vek (celé číslo). Do datových složek anonymní instance s názvem anonymniInstance uložte hodnoty "Pavel", 38
- Řešení: AnonymniTrida_Main
Následující kód vytváří
anonymní instanci se dvěma datovými složkami - viz Kód 1. Vzhledem k tomu, že jsme nedefinovali žádné datové typy, kompilátor
si je musí odvodit sám z jejich inicializace. Při definici anonymní třídy
vygeneruje kompilátor pro tuto třídu její vlastní název (ten se však
nedozvíme). Asi si říkáte, jak tedy máme deklarovat instanci této třídy, když
neznáme její jméno? Odpověď zní, využijeme deklaraci implicitně typované
proměnné, tzn., že použijeme klíčové slovo var
– viz kapitola Proměnná
– přiřazovací příkaz, výraz. Deklarace takové instance
by tedy vypadala následovně. Klíčové slovo var
způsobí, že kompilátor si vytvoří proměnnou stejného datového typu, jako je
výraz použitý při její deklaraci (v tomto případě je typem výrazu jakékoliv
jméno, které použil kompilátor pro vygenerování naší anonymní třídy).
//Deklarace instance anonymní třídy včetně inicializace datových složek anonymní instance var anonymniInstance = new { Jmeno = "Pavel", Vek = 38 };
Kód 1: Vytvoření instance anonymní třídy
K datovým složkám instance lze přistoupit pomocí tečkové notace –
viz Kód 2.
//Výpis hodnoty první datové složky instance anonymní třídy Console.WriteLine("Jméno: {0}", anonymniInstance.Jmeno); //Výpis hodnoty druhé datové složky instance anonymní třídy Console.WriteLine("Věk: {0}", anonymniInstance.Vek);
Kód 2: Výpis hodnot v datových složkách instance anonymní třídy
Na výpisu v konzoli můžeme vidět vypsané hodnoty obou datových složek instance anonymní třídy - viz Výstup programu - Kód AnonymniTrida_Main.
Anonymní instance:
Jméno: Pavel
Věk: 38
Výstup programu - Kód AnonymniTrida_Main: výpis hodnot datových složek instance anonymní třídy
Další anonymní instance této třídy lze
vytvářet stejným způsobem – viz Kód 3. Kompilátor
používá názvy, typy, počet a pořadí datových složek ke stanovení, zda dvě
instance anonymní třídy mají stejný typ.
//Deklarace další instance anonymní třídy včetně inicializace datových složek var jinaAnonymniInstance = new { Jmeno = "Petr", Vek = 39 };
Kód 3: Příklad vytvoření další instance anonymní třídy
Pořadí plnění datových složek jsme záměrně
prohodili za účelem testování – viz Kód 4. To je
však jedno v tomto případě jedno, protože jednotlivé datové složky jsou
pojmenovány a mají shodný datový typ.
//Prohození datových složek instance anonymní třídy var jinaAnonymniInstance = new { Vek = 39, Jmeno = "Petr" };
Kód 4: Příklad vytvoření další instance anonymní třídy – prohození datových složek
Anonymní instanci lze přiřadit jiné anonymní
instanci – viz Kód 5. Pokud
se ale myslíte, že se vytvoří kopie takové instance, není to pravda! Vytvoří se
pouze odkaz na jednu stejnou instanci. Vše co provádíte anonymniInstance se provádí i s jinaAnonymniInstance.
//Přiřazení instance jiné instanci jinaAnonymniInstance = anonymniInstance;
Kód 5: Příklad přiřazení instance třídy jiné instanci anonymní třídy