Hodnotové typy
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
Den v týdnu: CtVý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: 3Vý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