[PL] Enum

Enum to typ wyliczeniowy, który zawiera w sobie deklarację listy wartości stałych. Jego domyślnym typem jest integer, a wartość domyślna pierwszego elementu wynosi 0 i przy każdym kolejnym elemencie jest zwiększana o 1.

Deklarację enum’a rozpoczyna się od słowa kluczowego enum oraz nazwy, która go opisuje. Następnie w nawiasach klamrowych wypisuje się elementy, oddzielając je przecinkami:

enum EnumPrzyklad
{
enum01,
enum02,
enum03,
enum04
}

Elementy poszczególnych enum’ów możemy wywołać za pomocą odwołania się do nazwy jaką nadaliśmy i po kropce wybrać interesujący nas element (z pomoca przychodzi IntelliSense, który podpowiada nam, jakie elementy dodaliśmy do naszego zbioru). Możemy również przekonwertować wybrany element na domyślną wartość, pisząc wcześniej w nawiasach (int):

static void Main()
{
Console.WriteLine(EnumPrzyklad.enum01);
Console.WriteLine((int)EnumPrzyklad.enum04);
Console.ReadLine();
}

Output powyższego kodu będzie wyglądać następująco:

enum01
3

O czym warto pamiętać:

  1. Wartości mogą się powtarzać, muszą jedynie należeć do zbioru liczb całkowitych, np.
    {enum01 = 5, enum02 = 10, enum03 = -3, enum04 = 10}</td>
  2. Każdy element musi mieć unikalną nazwę, w przeciwnym wypadku dopisując np. drugi raz enum04otrzymammy poniższy błąd:
    The type 'EnumCSharpSample.EnumPrzyklad' already contains a definition for 'enum04'
  3. W nazwie danego elementu nie można używać spacji oraz podawać nazw elementów w cudzysłowiu.
  4. Zamiast int możemy skorzystać z następujących typów danych:
    • byte,
    • sbyte,
    • short,
    • ushort,
    • int,
    • long,
    • ulong

    definując w następujący sposób:

    enum EnumPrzyklad :long
    {
    enum01,
    enum02,
    enum03,
    enum04
    }
  • To ja dodam od siebie, że z tą informacją, że wartości enuma mogą się powtarzać to mnie zagięło. Ale z drugiej strony, nigdy nie byłem świadkiem takiego przypadku użycia i nie potrafię sobie wyobrazić przypadku użycia. Wg. mnie to sprawiłoby tylko tyle, że kod zacząłby być mniej czytelny, różne stałe wyliczeniowe z tej samej grupy miałby te same wartości.

  • Dodałbym jeszcze, że enum to tak naprawdę const int na sterydach i w kodzie IL odwołanie do enuma zastępowane jest jego wartością. Fakt ten może powodować “ciekawe” zachowanie kiedy przedefiniujemy enuma ale nie przekompilujemy biblioteki, która go używała.