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