Перейти до основного вмісту

Перелічення enum

Окрім примітивних типів даних, мова програмування C# має такий тип як enum або перелічення. Перелічення представляють набір логічно пов'язаних констант.

Перелічення оголошується за допомогою оператора enum:

enum назва_перелічення
{
// значення перелічення
value1,
value2,
.......
valueN
}

Після оператора enum йде назва перелічення. Потім у фігурних дужках перераховуються константи перелічення, розділені комами.

Визначимо найпростіше перелічення:

enum ЧасДня
{
Ранок,
День,
Вечір,
Ніч
}

Тут визначено перелічення ЧасДня, яке має чотири значення: Ранок, День, Вечір та Ніч.

Кожне перелічення фактично визначає новий тип даних, за допомогою якого ми можемо визначати змінні, константи, параметри методів тощо, так само як і з будь-яким іншим типом. Значення змінної, константи або параметра методу, які представляють перелічення, повинні бути однією з констант цього перелічення, наприклад:

const ЧасДня dayTime = ЧасДня.Ранок;

Далі в програмі ми можемо використовувати такі змінні/константи/параметри, як будь-які інші:

ЧасДня dayTime = ЧасДня.Ранок;

if(dayTime == ЧасДня.Ранок)
Console.WriteLine("Доброго ранку");
else
Console.WriteLine("Вітаю");

enum ЧасДня
{
Ранок,
День,
Вечір,
Ніч
}

Збереження стану

Часто змінна перелічення виступає як сховище стану, в залежності від якого виконуються певні дії:

ЧасДня now = ЧасДня.Вечір;

PrintMessage(now); // Добрий вечір
PrintMessage(ЧасДня.День); // Доброго дня
PrintMessage(ЧасДня.Ніч); // Надобраніч

void PrintMessage(ЧасДня dayTime)
{
switch (dayTime)
{
case ЧасДня.Ранок:
Console.WriteLine("Доброго ранку");
break;
case ЧасДня.День:
Console.WriteLine("Доброго дня");
break;
case ЧасДня.Вечір:
Console.WriteLine("Добрий вечір");
break;
case ЧасДня.Ніч:
Console.WriteLine("Надобраніч");
break;
}
}
enum ЧасДня
{
Ранок,
День,
Вечір,
Ніч
}

Тут метод PrintMessage() приймає значення типу перелічення ЧасДня як параметр і, в залежності від цього значення, виводить певне повідомлення.

Інший приклад:

DoOperation(10, 5, Операція.Додати); // 15
DoOperation(10, 5, Операція.Відняти); // 5
DoOperation(10, 5, Операція.Множити); // 50
DoOperation(10, 5, Операція.Ділити); // 2

void DoOperation(double x, double y, Операція op)
{
double result = op switch
{
Операція.Додати => x + y,
Операція.Відняти => x - y,
Операція.Множити => x * y,
Операція.Ділити => x / y
};
Console.WriteLine(result);
}
enum Операція
{
Додати,
Відняти,
Множити,
Ділити
}

Тут визначено перелічення Операція для представлення арифметичних операцій. Кожен тип операції визначається як одна з констант перелічення. Також визначено метод DoOperation(), який приймає два числа та тип операції у вигляді константи перелічення і, в залежності від цього типу, повертає результат визначеної операції за допомогою конструкції switch.

Тип та значення констант перелічення

Константи перелічення можуть мати тип. Тип вказується після назви перелічення через двокрапку:

enum Час : byte
{
Ранок,
День,
Вечір,
Ніч
}

Тип enum повинен обов'язково представляти цілий тип (byte, sbyte, short, ushort, int, uint, long, ulong). Якщо тип не вказано явно, типом за замовчуванням є int.

Тип впливає на значення, які можуть мати константи. За замовчуванням кожному елементу перелічення присвоюється ціле значення, де перший елемент має значення 0, другий — 1 і так далі. Наприклад, візьмемо вище визначене ЧасДня:

ЧасДня now = ЧасДня.Ранок;

Console.WriteLine((int) now); // 0
Console.WriteLine((int) ЧасДня.Ніч); // 3

enum ЧасДня
{
Ранок,
День,
Вечір,
Ніч
}

Ми можемо використовувати операцію приведення типів, щоб отримати ціле значення константи перелічення:

(int) ЧасДня.Ніч // 3

При цьому, хоча кожна константа відповідає певному числу, ми не можемо присвоїти їй числове значення:

ЧасДня now = 2; // ! Помилка

Ми також можемо явно вказати значення елементів, наприклад, задавши значення першого елемента:

enum ЧасДня
{
Ранок = 3, // кожен наступний елемент за замовчуванням збільшується на одиницю
День, // цей елемент має значення 4
Вечір, // 5
Ніч // 6
}

Але ви можете також явно вказати значення для всіх елементів:

enum ЧасДня
{
Ранок = 2,
День = 4,
Вечір = 8,
Ніч = 16
}

Константи перелічення можуть мати однакові значення, або ви навіть можете присвоїти одній константі значення іншої константи:

enum ЧасДня
{
Ранок = 1,
День = Ранок,
Вечір = 2,
Ніч = 2
}