Перечисления enum в C# — объявление и использование

Что такое enum
Enum (перечисление) — это именованный набор значений. Каждое значение имеет целочисленный индекс (по умолчанию начинается с 0). Enum повышает ясность кода и уменьшает число «магических» значений.
Важно: подлежащий тип enum по умолчанию — int. Можно явно задать другой целочисленный тип (byte, short, long и т. д.).
Как объявить enum в C
Обычно перечисления объявляют на уровне пространства имён или внутри класса, если это нужно для организации кода.
Пример простого объявления:
class Program
{
enum Weekday
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
static void Main(string[] args)
{
// Точка входа
}
}Если нужно, можно задать стартовый индекс для первого значения. Остальные последуют по порядку:
enum Weekday
{
Monday = 1,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}В этом примере Monday имеет значение 1, Tuesday — 2 и т. д.
Как получить имя и значение enum
Значение элемента перечисления — его целочисленный индекс. Например, при объявлении с Monday = 1 значение Weekday.Friday будет равно 5.
Получить имя по значению можно через Enum.GetName:
string friday = Enum.GetName(typeof(Weekday), Weekday.Friday);
Console.WriteLine("Ура, сегодня " + friday + "!");
// Вывод = Ура, сегодня Friday!Доступ по индексу:
Weekday tuesday = (Weekday)2;
Console.WriteLine("Сегодня " + tuesday);
// Вывод = Сегодня TuesdayПреобразование в целое число:
int mondayIndex = (int)Weekday.Monday;
Console.WriteLine(mondayIndex);
// Вывод = 1При передаче enum в Console.WriteLine() автоматически вызывается ToString(), поэтому выводится не число, а текстовое имя значения.
Как сравнивать enum
Перечисления можно сравнивать операторами (==, !=, <, >, <=, >=). Сравнение выполняется по числовым значениям.
Weekday day1 = Weekday.Monday;
Weekday day2 = Weekday.Tuesday;
if (day1 == day2)
{
Console.WriteLine("Дни одинаковые.");
}
else
{
Console.WriteLine("Дни разные.");
}Альтернативно можно использовать метод Equals():
if (day1.Equals(day2))
{
Console.WriteLine("Дни одинаковые.");
}
else
{
Console.WriteLine("Дни разные.");
}Частый сценарий — использовать switch для обработки всех значений перечисления:
Weekday valueToCompare = Weekday.Wednesday;
switch (valueToCompare)
{
case Weekday.Monday:
Console.WriteLine("Нужен кофе.");
break;
case Weekday.Tuesday:
Console.WriteLine("Нужен кофе.");
break;
case Weekday.Wednesday:
Console.WriteLine("Нужен кофе.");
break;
case Weekday.Thursday:
Console.WriteLine("Thursday is the new Friday!");
break;
case Weekday.Friday:
Console.WriteLine("Ура, выходные приближаются!");
break;
case Weekday.Saturday:
Console.WriteLine("Мой любимый день!");
break;
case Weekday.Sunday:
Console.WriteLine("Ещё один любимый день!");
break;
default:
Console.WriteLine("Недопустимый день недели.");
break;
}Как итерировать по enum
Enum.GetValues возвращает массив всех значений перечисления, Enum.GetNames — массив имён. Примеры:
foreach (Weekday day in Enum.GetValues(typeof(Weekday)))
{
Console.WriteLine((int)day); // индекс
Console.WriteLine(day); // имя
}foreach (string name in Enum.GetNames(typeof(Weekday)))
{
int index = (int)(Weekday)Enum.Parse(typeof(Weekday), name);
Console.WriteLine(index); // индекс
Console.WriteLine(name); // имя
}Когда enum не подходит
- Нужна динамическая коллекция значений, изменяемая во время выполнения. Enum — статическая конструкция компиляции.
- Требуются сложные значения (несколько полей на элемент). В этом случае лучше класс или структура.
- Нужна расширяемость плагинами или конфигурацией — тогда используйте конфиг/БД вместо enum.
Практические советы и паттерны
- Явно задавайте тип enum, если важно управление размером или сериализацией: enum Status : byte { … }
- Для битовых флагов используйте [Flags] и степени двойки (1, 2, 4, 8 …).
- При сериализации (JSON, бинар) проверьте ожидаемые значения на стороне клиента/сервера.
- В switch всегда добавляйте default, если есть вероятность некорректных данных.
Факт-бокс — ключевые моменты
- По умолчанию первый элемент enum имеет значение 0.
- Подлежащий тип по умолчанию — int. При необходимости задавайте другой тип.
- Enum статичен: изменить набор значений нельзя без перекомпиляции.
Контрольный список для разработчика
- Объявил enum в подходящем месте (namespace / класс).
- Явно задал подлежащий тип, если это важно.
- Добавил обработку случая по умолчанию в switch.
- Не использую enum там, где нужно динамическое расширение.
- Документировал значения и смысл индексов.
Критерии приёмки
- Код компилируется и корректно обрабатывает все значения enum.
- В тестах покрыты граничные и неверные значения (например, приведение из неподходящего числа).
- Сериализация/десериализация даёт ожидаемые результаты в используемом формате.
Примеры тестов/приёмки
- Приведение (Weekday)0 даёт ожидаемое имя, если enum начинается с 0.
- Приведение несоответствующего числа должно обрабатываться (проверкой или default).
- Для [Flags] проверяются побитовые комбинации и их согласованная обработка.
Краткая памятка (на одну страницу)
- enum = именованный набор целочисленных констант.
- Используйте Enum.GetValues/GetNames/Enum.Parse для итерации и преобразований.
- Для битов — [Flags].
- Для расширяемости — не enum.
1‑строчный глоссарий
- enum — перечисление значений.
- подлежащий тип — целочисленный тип, хранящий значения enum.
- [Flags] — атрибут для битовых флагов.
Итог: перечисления — лёгкий и безопасный способ ограничить набор допустимых значений и сделать код более читаемым. Используйте их там, где набор значений фиксирован и известен на этапе компиляции.
Похожие материалы
Отключить импорт фото Dropbox в Windows
Изменить текст кнопки Пуск в Windows XP
Как разблокировать Facebook — VPN, Tor, Psiphon
Как создать встречу из письма в Outlook
Как узнать SID в Windows — 5 способов