Підрозділ 2.24
Перерахування enum
Розглядає перерахування enum, зберігання стану, іменовані набори значень і зв'язок enum із числовими значеннями.
2.24. Перерахування enum
Перерахування (enum) — це тип даних, який визначає іменований набір логічно пов'язаних констант. Замість того щоб представляти стан, тип або категорію довільними числами чи рядками, enum дозволяє дати кожному можливому значенню зрозуміле ім'я. Це робить код самодокументованим: PatientStatus.Critical несе значно більше змісту, ніж магічне число 4 або рядок "critical", і водночас захищає від помилок — компілятор перевіряє, що змінній типу PatientStatus можна присвоїти лише одну з оголошених констант.
Оголошення enum
Перерахування оголошується за допомогою ключового слова enum, після якого йде ім'я типу та список констант через кому:
enum НазваПерерахування
{
Константа1,
Константа2,
// ...
КонстантаN
}Оголосимо перерахування для стану пацієнта в медичній системі:

За замовчуванням константи перерахування мають тип int і автоматично отримують числові значення починаючи з нуля — кожна наступна константа на одиницю більша від попередньої.
Enum як тип: змінні і параметри
Кожне оголошене перерахування є повноцінним типом даних. Змінні, параметри методів і поля класів можуть мати тип enum так само, як і будь-який примітивний тип:
Компілятор не дозволить передати у параметр PatientStatus довільне число або рядок — тільки одну з оголошених констант. Це унеможливлює цілий клас помилок, де передається некоректне значення.
Enum і switch: природне поєднання
Перерахування і конструкція switch чудово доповнюють одне одного. switch гарантує обробку кожного варіанту, а enum обмежує множину можливих значень:
Чому enum краще за рядки і «магічні числа»

Використання рядків або чисел для представлення фіксованого набору станів має серйозні недоліки: помилки в написанні ("admited" замість "admitted") залишаються непоміченими до часу виконання; компілятор не підказує які значення взагалі допустимі; код, що читає if (status == 2), нічого не говорить про семантику значення 2. enum усуває всі ці проблеми — IDE показує підказки з усіма допустимими значеннями, компілятор відхиляє некоректні присвоєння, а код читається як звичайна мова.
Тип і числові значення констант
За замовчуванням enum використовує тип int. Явно вказати інший цілий тип можна через двокрапку після назви:
Допустимі типи для enum: byte, sbyte, short, ushort, int, uint, long, ulong. Для більшості застосунків int (за замовчуванням) є правильним вибором; byte або short корисні при великій кількості екземплярів enum у пам'яті.
Явне призначення числових значень
Константам можна явно призначити числові значення. Якщо вказати значення лише першій константі — решта отримують значення послідовно від неї:
Явні значення зручні, коли числові значення мають зовнішній сенс — наприклад, відповідають кодам у базі даних або протоколі обміну. Перетворення між enum і числовим типом виконується явним приведенням: (int)priority або (PriorityLevel)5.
Зворотне перетворення — з числа у константу enum — також робиться через приведення, але слід пам'ятати: якщо числове значення не відповідає жодній константі, C# не кине винятку, а поверне enum зі значенням, яке не має імені. Тому при роботі з ненадійними зовнішніми даними перед перетворенням варто перевіряти через Enum.IsDefined.