1. Třída

Abychom pochopili rozdíl mezi hodnotovým a referenčním datovým typem, je nejprve objasnit pojem třída (ta je referenčního typu).

Jazyk C# je objektově orientovaný jazyk (dále budeme využívat zkratku „OOP“ – anglicky „Object Oriented Programming“ - objektově orientované programování). Když jsme poprvé analyzovali základní program vygenerovaný pro konzoli, náš Program.cs definoval třídu Program a metodu Main, která náležela této třídě (anglicky „Class“). Třída – klíčové slovo class - je kořenem slova klasifikace anglicky „Classification“. V C# je veškerý spustitelný kód definován v rámci metody a všechny metody musí patřit do třídy nebo struktury.

Microsoft .NET Framework obsahuje tisíce tříd, z nichž už jsme si některé vyzkoušeli např. Console a Exception. Třídy poskytují mechanismus pro modelování tzv. entit (anglicky „Entity“), které odrážejí prvky reálného světa, ale i abstraktní věci. Součástí návrhu systému je vždy analýza, jejímž cílem je vymezit důležité entity, které jsou ve vztahu s procesy, které daný systém implementuje a správně definovat data, která mají tyto entity obsahovat a jaké funkce mají provádět. Informace, které třída uchovává, jsou ukládány ve formě datových složek (anglicky "Fields" - nazývaných též atributy) a operace jsou implementovány jako metody (anglicky "Methods"). [6]

Když definujeme třídu, musíme systematicky uspořádat informace a chování do smysluplné entity – jedná se tedy o akt klasifikace, který v podstatě děláme každý a nejen programátoři. Ukažme klasifikaci na příkladu auta. Automobily mají společné vlastnosti, můžeme je řídit, zastavit, rozjet apod – představme si tyto vlastnosti jako metody. Mají také společné atributy – kola, volant, motor apod. Vidíme, že auta mají společné prvky, lze tedy odvodit jistý předpis, který je společný pro podstatnou většinu aut – třída. Třída je předpisem pro vytvoření objektu. Pokud je objekt vytvořen na základě definované třídy, lze ho také obecně nazvat tzv. instancí příslušné třídy. Instance je vytvářena za běhu programu. Instance má stejné rozhraní jako třída, podle které je vytvořena. Jednotlivé objekty třídy se od sebe navzájem liší svými atributy. Jako příklad nám poslouží dva objekty třídy Auto jakými jsou např. autoOctavia a autoFord. Tato dvě auta (objekty) se budou se lišit svými atributy, tzn., že mají různé parametry např. SPZ, typ, objem [cm3] a výkon [kW] motoru, spotřeba [l/100 km], cena [Kč], rok výroby apod. Tyto atributy jsou uloženy pomocí tzv. datových složek, které využíváme pro uložení informací např. u objektu autoOctavia budou nastaveny parametry auta, tj. atributy objektu jako SPZ = "4P49462"; typMotoru = "TDI"; objemMotoru = 1.9; vykonMotoru = 81, spotrebaMotoru = 5, atd. Asi cítíme, že to jiné nastavení parametrů auta můžeme udělat i u objektuFord.

Další důležitou vlastností objektově orientovaného programování je zapouzdření (anglicky "Encapsulation"). Atributy a metody objektu tvoří nedělitelný celek a vzájemně se ovlivňují. Díky zapouzdření může objekt své metody a atributy skrýt před okolím. Představme si, že bychom u automobilu měli volně přístupnou metodu vypusť nádrž. Asi bychom nechtěli, aby jiný programátor nám omylem vypustil právě natankované auto. Členy přístupné okolí se nazývají rozhraní (anglicky "Interface") objektu.

V programování jsme se již s něčím podobným setkali. Využívali jsme proměnné, které byly jistého datového typu a pomocí metod jsme mohli ovlivňovat hodnoty uložené v těchto proměnných. Objekt reprezentuje složitější proměnnou složitějšího datového typu – třídy (v našem příkladu Auto). Když jsme potřebovali vytvořit proměnnou, deklarovali jsme ji. Když potřebujeme vytvořit objekt, použijeme konstruktor (v našem příkladu auta si můžeme představit konstruktor jako metodu, která nastaví parametry auta např. typMotoru = "TDI"; objemMotoru = 1.9; vykonMotoru = 81). Když jsme potřebovali zacházet s proměnnými, použili jsme metody. K zacházení s jednotlivými objekty (popřípadě jeho datovými složkami) budeme používat také metody (v našem příkladu metoda Zastav, Rozjed, Zpomal atd.). Pokud mluvíme o objektovém programu, skládá se pouze z objektů, kde si mezi sebou objekty navzájem posílají zprávy, tzn., že volají (spouštějí) své metody (v našem případě auto může komunikovat s jiným autem např. předání informací o stavu na vozovce).