Гид по технологиям

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

4 min read Программирование Обновлено 05 Dec 2025
Перечисления enum в C# — примеры и советы
Перечисления 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] — атрибут для битовых флагов.

Итог: перечисления — лёгкий и безопасный способ ограничить набор допустимых значений и сделать код более читаемым. Используйте их там, где набор значений фиксирован и известен на этапе компиляции.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Отключить импорт фото Dropbox в Windows
Windows

Отключить импорт фото Dropbox в Windows

Изменить текст кнопки Пуск в Windows XP
Windows XP

Изменить текст кнопки Пуск в Windows XP

Как разблокировать Facebook — VPN, Tor, Psiphon
Обход блокировок

Как разблокировать Facebook — VPN, Tor, Psiphon

Как создать встречу из письма в Outlook
Outlook

Как создать встречу из письма в Outlook

Как узнать SID в Windows — 5 способов
Windows

Как узнать SID в Windows — 5 способов

Сменить имя пользователя в Instagram быстро
Социальные сети

Сменить имя пользователя в Instagram быстро