2. Hodnotové typy

2.6. Výčtový typ

Představte si, že potřebujete vytvořit vlastní seznam položek, např. roční období. Tento seznam by mohl obsahovat čtyři celá čísla 1, 2, 3 a 4 z nichž 1 by definovala jaro, 2 zase léto apod. Sami vidíte, že tento přístup není moc intuitivní a po čase, až byste se vrátili ke kódu, tak by Vám rozpoznávání jednotlivých časových podle čísel mohlo dělat potíže. C# nám nabízí možnost vytvoření vlastního seznamu pojmenovaných konstant (též nazývaných literálů) definovaných programátorem – enumerační neboli výčtový typ (anglicky „Enumeration“). Tento seznam představuje skupinu pojmenovaných konstant tvořících samostatný datový typ. Obecně bychom syntaxi deklarace v C# tohoto typu mohli popsat:

enum jméno { seznam_konstant}

kde:

  • enum - představuje klíčové slovo uváděné v deklaraci výčtového typu
  • jméno - identifikátor výčtového typu 
  • seznam_konstant - představuje pojmenované konstanty tohoto definovaného výčtového typu


Poněvadž se jedná o seznam pojmenovaných konstant, můžeme v deklaraci výčtového typu provádět inicializaci, tzn., že konstantě můžeme přiřadit hodnotu pomocí operátoru přiřazení. Standardně C# pojmenované konstanty asociuje s datovým typem int. Prvnímu prvku přiřadí hodnotu 0 a dalšímu o 1 vyšší. Pojmenovaným konstantám také můžeme individuálně přiřazovat různé hodnoty.

Výčtový typ standardně asociuje pojmenované konstanty s datovým typem int. Pokud ale chceme, můžeme specifikovat i jiný celočíselný datový typ (byte, sbyte, short, ushort, int, uint, long, ulong) pro tyto konstanty (např. kvůli úspoře paměti použijeme menší datový typ short), který uvedeme za dvojtečku za názvem výčtového typu.

U deklarace proměnné výčtového typu lze také použít tzv. modifikátor ?, který uvedeme za výčtový typ a přiřadíme prázdnou hodnotu. [6]


Ilustrativní příklad VyctovyTyp
Program VyctovyTyp

  • Popis: Příklad deklarace výčtového typu, deklarace proměnné tohoto typu včetně přiřazení hodnoty
  • Zadání: V třídě Program  deklarujte výčtový typ dnyVTydnu, skládající se ze zkratek dní v týdnu uvedených bez diakritiky např. Po, Ut atd. V hlavní metodě Main deklarujte proměnnou s názvem den, která bude výčtového typu dnyVTydnu. Přiřaďte této proměnné hodnotu Ct. Hodnotu uloženou v proměnné vypište v Main
  • Řešení: VyctovyTyp_Main

Na příkladu výčtového typu s názvem dnyVTydnu si ukážeme, jak deklarovat výčtový typ zahrnující zkratky jednotlivých dnů v týdnu – viz Kód 1. Tento výčtový typ jsme uvedli mimo metodou Main ve třídě Program. 

class Program
{
    //Deklarace výčtového typu
    enum dnyVTydnu { Po, Ut, St, Ct, Pa, So, Ne };

Kód 1: Deklarace výčtového typu dnyVTydnu

Vzhledem k tomu, že jsme si definovali vlastní výčtový typ, můžeme si v hlavní metodě Main deklarovat proměnnou den tohoto datového typu – viz Kód 2.

static void Main(string[] args)
{
    //Deklarace proměnné datového typu výčtový typ
    dnyVTydnu den;

Kód 2: Deklarace proměnné den výčtového typu dnyVTydnu v metodě Main

Jak jsme zvyklí z minulých kapitol kurzu, již deklarované proměnné můžeme přiřadit hodnotu. V tomto případě ale musíme přiřazovat kompatibilní hodnotu (stejného datového typu), tzn. pojmenovanou konstantu z výčtového typu dnyVTydnu. My jsme zvolili položku, jež představuje čtvrtek. Pro přístup k této konstantě výčtového typu používáme tzv. tečkovou notaci, tj. tečku „.“ uváděnou za výčtovým typem, tzn. hodnota dnyVTydnu.Ct – viz Kód 3. Pokud by existoval nesoulad typů, museli bychom použít konverzi – přetypování.

//Přiřazení hodnoty proměnné
den = dnyVTydnu.Ct;

Kód 3: Přiřazení hodnoty proměnné den 

Pokud bychom chtěli vypsat prvek výčtového typu uložený v proměnné den, stačí vypsat následující kód – viz Kód 4.
//Výpis názvu hodnoty (konstanty) uložené v proměnné
Console.WriteLine("Den v týdnu: {0}", den);

Kód 4: Příklad výpisu obsahu proměnné den

Ve výpisu v konzoli vidíme, že byl vypsán název pojmenované konstanty, tedy Ct – viz Výstup programu - program VyctovyTyp_Main.

Den v týdnu: Ct

Výstup programu - program VyctovyTyp_Main: Výpis proměnné den výčtového typu


Ilustrativní příklad VyctovyTypIndex
Program VyctovyTypIndex

  • Popis: Příklad deklarace výčtového typu, asociace s datovým typem short, deklarace proměnné výčtového typu, přiřazení hodnoty konstantě výčtového typu a aritmetická operace nad položkami výčtového typu
  • Zadání: V třídě Program  deklarujte výčtový typ dnyVTydnu jehož pojmenované konstanty jsou datového typu short. Výčtový typ se skládá se ze zkratek dní v týdnu uvedených bez diakritiky např. Po, Ut atd. V hlavní metodě Main deklarujte proměnnou s názvem den, která bude výčtového typu dnyVTydnu. Přiřaďte této proměnné hodnotu Ct. V hlavní metodě Main vypište obsah proměnné (čtvrtek) a jaké pořadové číslo dne v týdnu představuje hodnota uložená v této proměnné. Dále vypište předchozí den včetně jeho indexu. Pondělí představuje první den v týdnu 
  • Řešení: VyctovyTypIndex_Main


V příkladu jsme pro konstanty výčtového typu tentokrát použili datový typ short (menší rozsah intervalu datového typu short pro nás znamená menší paměťové nároky programu). Tento datový typ uvedeme za dvojtečku za názvem výčtového typu v jeho deklaraci - viz Kód 5. Samozřejmě platí, že přiřazovaná hodnota musí být v rozsahu zvoleného datového typu.

Pokud jsme první pojmenované konstantě výčtového typu přiřadili např. hodnotu 1, pak každá následující konstanta bude mít v sobě hodnotu o 1 vyšší než ta předchozí – viz Kód 5. Tyto hodnoty představují index dne v týdnu.

//Deklarace výčtového typu datového typu short s přiřazením hodnoty konstantě
enum dnyVTydnu : short { Po = 1, Ut, St, Ct, Pa, So, Ne };

Kód 5: Deklarace výčtového typu dnyVTydnu datového typu short s přiřazení hodnoty konstantě

Pro přiřazení hodnoty deklarované proměnné den výčtového typu dodržíme stejný postup jako v předchozím případu - viz Kód 2 a Kód 3. 

Ve výpisu indexu dne, však musíme obsah proměnné den přetypovat na datový typ int, protože potřebujeme přistoupit k hodnotě (indexu), která je uložena v konstantě Ct – viz Kód 6.

//Vypis hodnoty v položce (konstantě) - použití přetypování
Console.WriteLine("Den týdne: {0} a index tohoto dne: {1}", den, (int)den);

 Kód 6: Příklad výpisu obsahu uloženého v proměnné a indexu položky datového typu

U výčtových typů můžeme také použít operátory, které využíváme pro celočíselné proměnné, např. můžeme porovnávat pomocí operátoru ==, nebo dokonce provést aritmetickou operaci – viz Kód 7. Odečteme hodnotu 1 od proměnné den, čímž přistoupíme k předchozí položce (konstantě) uvedené ve výčtovém typu. Dále necháme vypsat index předchozí dne - v našem případě hodnotu 4 - 1 - viz Kód 7. 

//Vypis hodnoty v předchozí položce (konstantě) - použití přetypování
Console.WriteLine("Den předchozí: {0} a index tohoto dne: {1}", den-1, (int)den-1);

Kód 7: Příklad výpisu obsahu proměnné a indexu předchozí položky výčtového typu

Výpis hodnoty uložené v proměnné (položky výčtového typu a předchozí položky) včetně indexu této a předchozí položky by vypadal následovně - viz Výstup programu - VyctovyTypIndex_Main.

Den týdne: Ct a index tohoto dne: 4
Den předchozí: St a index tohoto dne: 3

Výstup programu - VyctovyTypIndex_Main - ukázka výpisu obsahu proměnné a indexu

U deklarace proměnné výčtového typu lze v inicializaci přiřadit i prázdnou hodnotu za použití modifikátoru ? - viz Kód 8.

//Deklarace proměnné výčtového typu s inicializací prázdné hodnoty
dnyVTydnu? den = null;

Kód 8: Příklad deklarace proměnné s přiřazením prázdné hodnoty