Перелічення 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
}