Paweł Łukasiewicz
2019-06-03
Paweł Łukasiewicz
2019-06-03
Udostępnij Udostępnij Kontakt
Wprowadzenie

W języku C# słowo enum reprezentuje typ wyliczeniowy. Typ wyliczeniowy to stałe liczby reprezentowane przez wartość. W poniższym wpisie skupimy się na kilku przykładach pracy z typami wyliczeniowymi.

Enum to sposób na definiowanie zestawu nazwanych, stałych całkowitych, które mogą zostać przypisane do zmiennej. Każdy z elementów wyliczenia jest reprezentowany przez wartość całkowitą zaczynającą się od 0 (o ile domyślne zachowanie nie zostane nadpisane przez programistę).

Tym wyliczeniowy jest deklarowany przez słowo kluczowe enum po którym pojawia się nazwa zdefiniowanego wyliczenia i jej wartości w nawiasie.

Poniżej przykład definicji dla różnych typów samochodów:

enum CarTypes
{
    Hatchback,
    Sedan,
    MPV,
    SUB,
    Crossover,
    Coupe,
    Convertible
}

W powyższym przykładzie pierwsza wartość, tj. Hatchback ma przypisana wartość 0 a każda kolejna jest zwiększana o 1.

Tyle tytułem wprowadzenia. Przejdźmy do właściwej części artykułu i 7-miu sposobów na pracę z typem wyliczeniowym.

1. Deklaracja typów wyliczeniowych

Poniżej przykład deklaracji dwóch typów wyliczeniowych:

enum CarTypes
{
    Hatchback,
    Sedan,
    MPV,
    SUV,
    Crossover,
    Coupe,
    Convertible
}

enum OptymizedCarTypes : byte
{
    Hatchback,
    Sedan,
    MPV,
    SUV,
    Crossover,
    Coupe,
    Convertible
}
Domyślną reprezentacją całkowitą typu wyliczeniowego jest int - pozwala na przechowywanie 4,294,967,295 wartości. Użycie drugiego wariantu ograniczą tą liczbę do zakresu wartości 0 – 255 pozwalając przy tym zaoszczędzić ilość miejsca zajmowanego przez daną wartość. Jeżeli typy wyliczeniowe przechowujemy w bazie danych czy pliku binarnym zajmą one 1 bajt zamiast 4 w przypadku pierwszej deklaracji.

Domyślna wartość to 0 – zwiększna o 1 dla każdej kolejnej wartości. Możemy jednak przypisać swoje własne wartości w poniższy sposób:

enum CarTypes
{
    Hatchback = 2,
    Sedan = 4,
    MPV = 6,
    SUV,
    Crossover,
    Coupe,
    Convertible
}
Każda kolejna, nieokreślona wartość, jest większa o 1 od poprzedzającej.

2. Iterowanie typów wyliczeniowych

Metoda GetValues(...) pozwala na przechodzenie przez wartości wyliczeniowe. W poniższym fragmencie kodu wyświetlimy wszystkie zdefiniowane typy pojazdów:

// poniższy kod pozwala na wyświetlenie wartości liczbowych 
// odpowiadająchych kolejnym typom pojazdów
foreach (int item in Enum.GetValues(typeof(CarTypes)))
{
    Console.WriteLine(item);
}
Jeżeli chcemy poznać reprezentację tekstową możemy posłużyć się poniższym kodem:
foreach (string item in Enum.GetNames(typeof(CarTypes)))
{
    Console.WriteLine(item);
}

3. Enum -> łańcuch znaków

W tym celu możemy posłużyć się metodą ToString(), która pozwala na przekonwertowanie wartości wyliczeniowej na łańcuch znaków:

string value = CarTypes.Convertible.ToString();

4. Enum -> reprezentacja całkowita

W powyższym przypadku możemy skorzystać z metody wspominej powyżej, tj. GetValues(...) lub skorzystać z prostego rzutowania:

int i = (int)CarTypes.Convertible;

5. Enum wg. wartości liczbowej

Metoda Enum.GetName pozwala na pobranie nazwy wartości wyliczeniowej. Używając poniższego kodu jesteśmy w stanie pobrać nazwę wartości konkretnego typu wyliczeniowego:

string s = Enum.GetName(typeof(CarTypes), 7);

6. Tablica wszystkich wartości wyliczeniowych

Poniższy kod pozwala na pobranie wszystkich wartości typów wyliczeniowych i przypisanie ich do tablicy:

string[] carTypesArray = Enum.GetNames(typeof(CarTypes));

7. Lista wszystkich wartości wyliczeniowych

Poniższy kod pozwala na dodanie wszystkich wartości typów wyliczeniowych do listy a następnie przeprowadzenia iteracji w celu wyświetlania tych wartości:

List<string> carTypesList = new List<string>(Enum.GetNames(typeof(CarTypes)));
foreach (string item in carTypesList)
{
    Console.WriteLine(item);
}

Podsumowanie

I to już wszystko w tym wpisie. Mam nadzieję, że praca z typami wyliczeniowymi będzie prostsza i bardziej efektywna.