Strona główna » Kursy » Kurs C# » Typ Wyliczeniowy Enum
 

Typ Wyliczeniowy Enum

Wstęp

W programowaniu bardzo często dochodzi do sytuacji, gdy wartościom liczbowym przpisujemy znaczenie. Funkcja może zwrócić liczbę jako status wykonania zadania. Wtedy można przypuścić, że 0 będzie oznaczać sukces, 1 - nie wszystko zostało wykonane, a 2 - wystąpił błąd. Taki sposób jest prosty, ale wymaga od użytkownika zapamiętania, że liczba zwracana przez funkcję coś oznacza oraz co. Z tego powodu nie jest to narzędzie bardzo wygodne, ale z pewnością poprawne. W przypadku, gdy zwracany typ danych ma posiadać znaczenie to można zastosować typ wylieczniowy Enum.

Implementacja

Utworzenie typu

W celu skorzystania z typu wyliczeniowego należy go najpierw utworzyć. Składnia wymaga podania typu enum potem nazwy i na koniec w nawiasach klamrowych kolejne opcje rozdzielone przecinkiem.

  1. enum NAZWA {
  2.   OPCJA1, OPCJA2, OPCJA3, ..., OPCJAN
  3. }

Zarówno NAZWA jak i dowolna z OPCJI muszą być poprawnie zapisane. Nazewnictwo rządzi się takimi samymi regułami jak nazywanie zmiennych. Przede wszystkim należy pamiętać, że musi to być ciągły ciąg znaków, a nie ze znakiem spacji.

Zastosowanie

Zadeklarowany przed chwilą typ deklaruje się jak każdy inny typ danych. Należy podać typ, nazwę i ewentualnie od razu przy deklaracji przypisać nazwę. W celu odwołania się do opcji to należy wpisać nazwę typu, kropkę i wybrać wybraną wartość. W poniższym przykładzie najpierw jest deklarowany typ danych Tydzień, który zawiera nazwy wszystkich kolejnych dni tygodnia.

  1. enum Tydzień {
  2.   Poniedziałek, Wtorek, Środa, Czwartek, Piątek, Sobota, Niedziela
  3. }

Następnie w programie zostaje on zadeklarowany i przypisana zostaje wartość, które potem zostaje wypisana.

  1. static void Main(string[] args) {
  2.   Tydzień ulubiony = Tydzień.Piątek;
  3.   Console.WriteLine("Mój ulubiony dzień to {0}", ulubiony);
  4.   Console.ReadKey();
  5. }
  1. Mój ulubiony dzień to Piątek

Tutaj warto zauważyć, że podczas wypisywania typu wyliczeniowego wypisywana jest wartość słowna wybranej opcji. Pozwala to na bardzo wygodne zarządzanie danymi ich wypisywania użytkownikowi. W przypadku zastosowania metody zapisu danych jako liczby należałoby dodatkowo gdzieś trzymać tablicę nazw tygodnia. Nie zawsze jest to najwygodniejsza metoda.

Wczytywanie danych

Typ wyliczeniowy Enum zapewnia możliwość parsowania danych tekstowych na wartość opcji. Jednak konwertowany napis oraz opcja muszą być identyczne. Inaczej zwrócony zostanie błąd. Poniższy program wczytuje użytkownika nazwę ulubionego dnia tygodnia i obsługuje błąd, który może zostać zwróćony przez funkcję parsującą.

  1. static void Main(string[] args) {
  2.   Tydzień ulubiony;
  3.   Console.WriteLine("Podaj swój ulubiony dzień tygodnia:");
  4.   try {
  5.     ulubiony = (Tydzień)Enum.Parse(typeof(Tydzień), Console.ReadLine());
  6.     Console.WriteLine("Twój ulubiony dzień to {0}", ulubiony);
  7.   } catch (Exception) {
  8.     Console.WriteLine("Wystąpił błąd parsowania");
  9.   }
  10.   Console.ReadKey();
  11. }

(2.) Tworzymy zmienną i (3.) pytamy użytkownika o dzień tygodnia. Potem (4.) próbujemy (5.) parsować dane, a (6.) następnie je wypisać. Jednak (7.) jeśli wystąpi błąd to (8.) wypisujemy komunikat o błędzie.

Wartości Liczbowe

Wypisane opcje przypominają liste na której elementy mają kolejne indeksy począwszy od 0. Oznaczałoby to, że można sprawdzić wartość k pozycji dalej. Każdej wartości w typie wyliczeniowym można przypisać unikalne ID liczbowe. Wartości te wcale nie muszą być równe pozycji "na liście" opcji, ale muszą być unikalne. Wtedy nowy typ danych można zadeklarować następująco:

  1. enum NAZWA {
  2.   OPCJA1 = 0, OPCJA2 = 1, OPCJA3 = 2, ..., OPCJAN = n
  3. }

Dzięki temu możliwe jest, aby dodawać i odejmować wartości od typu wyliczeniowego. Może to znaleźć zastosowanie kiedy na pytanie "Jaki jest Twój ulubiony dzień tygodnia?" ktoś nam odpowie dwa dni po środzie. Wtedy możemy zaprogramować komputer, aby pomógł z odpowiedzią. Najpierw dodajmy każdemu dnia tygodnia jego wartość:

  1. enum Tydzień {
  2.   Poniedziałek = 0, Wtorek = 1, Środa = 2, Czwartek = 3, Piątek = 4, Sobota = 5, Niedziela = 6
  3. }

I teraz można spokojnie skorzystać z "przesuwania" dnia tygodnia:

  1. Tydzień ulubiony = Tydzień.Środa;
  2. ulubiony += 2;
  3. Console.WriteLine("Twój ulubiony dzień to {0}", ulubiony);
  1. Piątek

Zaletą przypisywania wartości liczbowych do danych w typie wyliczeniowym jest fakt, że można je później zamienić na wartość liczbową. Może się to przydać później, aby na podstawie tego typu utworzyć date.

  1. int o = (int) ulubiony;
  2. Console.WriteLine("Wartość w typie wyliczeniowym: {0}", o);
  1. 4

Podsumowanie

Ty wyliczeniowy to bardzo wygodne narzędzie. Należy o nim pamiętać w sytuacjach, gdy dana zmienna może przyjmować określony zestaw odpowiedzi. Znajduje to zastosowanie jak przedstawione wyżej podczas wybiera dni tygodnia, ale może również np. podczas określania opcji przyjmowanych przez funkcję.

Zadania

Zadanie 1

Napisz program, który dla dnia tygodnia podanego w zmiennej tyg typ Tydzień będzie pokazywać jego skrót. Przykładowo program dla wartości "Środa" powinien wypisać:

  1. Środa ma skrót Śr

Zadanie 2

Napisz program, który wczyta od użytkownika aktualny dzień tygodnia i wypisze wszystkie, które w danym tygodniu pozostały. Zakładamy, że tydzień zaczyna się w Poniedziałek. Przykładowo jeśli użytkownik wpisze Czwartek to powinien wypisać:

  1. Piątek
  2. Sobota
  3. Niedziela