Datové typy takové typy, u kterých proměnná neobsahuje samotná data, ale pouze odkaz (referenci) na místo v paměti, kde jsou data uložena – obvykle na haldě (heap).

Při přiřazení jedné referenční proměnné do druhé, se nepřekopíruje se celý objekt, ale obě proměnné budou obsahovat odkaz na stejný objekt v paměti. Pokud dojde k úpravě jedné z nich, změna se automaticky projevují v obou, protože se jedná pořád o stejný objekt.

Halda (Heap)

  • Neorganizovaná oblast paměti, která se používá pro dynamickou alokaci objektů za běhu programu.
  • Na rozdíl od zásobníku je její správa pomalejší, ale umožňuje uchovávat větší data s delší životností
  • Čištění objektů na haldě je zajišťováno Garbage Collectorem (Správa paměti)
  • K datům uloženým na haldě se přistupuje pomocí referencí

Příklady referenčních datových typů

Objekt (object)

  • Základní datový typ, který je využívaný v objektově orientovaných jazycích
  • Jakýkoliv typ lze pomocí explicitní konverze převést na objekt. Konverzí ale dojde ke ztrátě přímé informace o datovém typu.
  • Objekt je zároveň možné zkonvertovat na libovolný datový typ. Tato konverze nemusí uspět v případě, že data uložená v objektu není možné zkonvertovat.
int x = 7;
object myObject = x; // implicitní konverze
 
int number = (int) myObject; // explicitní konverze z objektu na int

Řetězec (string)

  • Datový typ pro uložení posloupnosti znaků
  • Více informací viz String
string firstName = "Pepa";

Statické pole

  • Základní datový typ, který umožňuje uložení více hodnot stejného datového typu
    • Více informací o kolekcích: Kolekce
  • Velikost pole je fixně dána při jeho alokaci a není možné ji měnit
  • Data jsou v paměti uložena v jednom souvislém paměťovém bloku
  • Každý prvek je v poli uložen na nějakém indexu
    • Indexy v poli jsou celá čísla od do velikosti pole
    • Při pokusu o přístup na index mimo pole dojde k vyhození výjimky IndexOutOfRangeException
  • Každá pole má vlastnost Length, ve které je uložena velikost pole (mojePole.Length)
int[] numbers = new int[3];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
 
// Alternativně
int[] numbers = new int[] { 1, 2, 3 };
 
// Zkráceně
int[] numbers = { 1, 2, 3 };
  • V některých případech je potřebné uložit data ve více dimenzích (např. při ukládání tabulky nebo matice). Pro to, je nutné při deklaraci datového typu do hranatých závorek umístit čárku. Počet čárek je roven počtu dimenzí , tedy pro uložení tabulky bude datový typ vypadat: int[,] table;, pro 3D: int[,,] cube; atd.
    • Takto vytvořené pole má vždy úplnou velikost – pokud je rozměr , tak se alokuje velikost
int[,] matrix = new int [3, 2]
{
    { 1, 2 },
    { 4, 5 },
    { 7, 8 }
};
 
Console.WriteLine(matrix[0, 1]); // Výstup: 2

Zubaté pole (Jagged array)

Pole, které umožňuje, že každý řádek má jinou délku. Toto řešení dokáže ušetřit paměť, protože není nutné alokovat paměť, která se nevyužije. Nicméně se používá velmi zdřídka.

public static int[][] JaggedPole = new int[][]
{
    new int[] { 1, 2 },
    new int[] { 3, 4, 5 }
};

Třída

  • Umožňuje seskupit data a funkcionalitu na jedno místo.
  • Jedná se o heterogenní datový typ, tedy je možné do něj uložit různé datové typy.
  • Více informací o třídách lze nalézt Třídy.
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}