← Назад к вопросам

Что такое enum?

1.0 Junior🔥 201 комментариев
#Коллекции и структуры данных#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое enum в C#?

Enum (перечисление) — это особый тип данных в C#, предназначенный для определения именованных константных значений. Он позволяет создать новый тип с фиксированным набором допустимых значений, что повышает читаемость, безопасность и структурированность кода. По сути, enum — это набор логически связанных именованных констант.

Основные характеристики enum

  • Именованные константы: Каждое значение enum имеет уникальное имя (идентификатор), что делает код более понятным, чем использование "магических чисел".
  • Базовый тип: По умолчанию базовым типом для enum является int, но можно явно указать другие целочисленные типы: byte, sbyte, short, ushort, long, ulong.
  • Начинаются с 0: Значения автоматически присваиваются, начинаясь с 0 и увеличиваясь на 1 для каждого следующего элемента, если не заданы явно.
  • Сильная типизация: Компилятор обеспечивает проверку типов, предотвращая присвоение недопустимых значений.

Синтаксис и базовый пример

// Определение enum с базовым типом int (по умолчанию)
public enum DayOfWeek
{
    Monday,    // Значение: 0
    Tuesday,   // Значение: 1
    Wednesday, // Значение: 2
    Thursday,  // Значение: 3
    Friday,    // Значение: 4
    Saturday,  // Значение: 5
    Sunday     // Значение: 6
}

// Использование в коде
DayOfWeek today = DayOfWeek.Monday;
Console.WriteLine(today); // Вывод: Monday
Console.WriteLine((int)today); // Вывод: 0

Полезные возможности enum

1. Явное присвоение значений

Можно задавать конкретные числовые значения для элементов, что полезно для соответствия внешним системам (например, кодам в API или базах данных).

public enum HttpStatusCode
{
    Ok = 200,
    BadRequest = 400,
    NotFound = 404,
    InternalServerError = 500
}

2. Использование флагов (битовые маски)

Enum можно использовать как набор флагов с помощью атрибута [Flags] и присвоения значений степеням двойки. Это позволяет комбинировать значения с помощью битовых операций.

[Flags]
public enum Permissions
{
    None = 0,
    Read = 1,   // 1 << 0
    Write = 2,  // 1 << 1
    Delete = 4, // 1 << 2
    All = Read | Write | Delete // Комбинация: 7
}

// Использование
Permissions userPermissions = Permissions.Read | Permissions.Write;
if (userPermissions.HasFlag(Permissions.Read))
{
    Console.WriteLine("Пользователь может читать.");
}

3. Методы работы с enum

Класс Enum предоставляет статические методы для анализа и преобразования enum.

  • Enum.GetValues(Type): Получение массива всех значений.
  • Enum.GetName(Type, object): Получение имени по значению.
  • Enum.Parse(Type, string): Преобразование строки в значение enum (с учетом регистра или без).
  • Enum.TryParse<T>(string, out T): Безопасное преобразование строки.
// Получение всех значений enum
foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)))
{
    Console.WriteLine($"{day} = {(int)day}");
}

// Парсинг строки в enum
string input = "Wednesday";
DayOfWeek parsedDay;
if (Enum.TryParse(input, out parsedDay))
{
    Console.WriteLine($"Успешно распарсили: {parsedDay}");
}

Преимущества использования enum

  • Улучшение читаемости кода: DayOfWeek.Monday явно лучше, чем число 0.
  • Ограничение допустимых значений: Компилятор предотвращает присвоение, например, DayOfWeek = 10.
  • Упрощение проверок: Использование в switch и сравнениях становится безопаснее.
  • Интеграция с инструментами: Автодополнение в IDE, отображение в документации.
  • Безопасность типов: Нельзя случайно смешать с другими целочисленными типами без явного преобразования.

Ограничения и рекомендации

  • Не для динамических наборов: Enum определяется на этапе компиляции и не может изменяться в runtime.
  • Не добавлять "резервные" значения: Избегайте значений типа Unknown или Other, если нет четкой бизнес-логики.
  • Использовать для действительно фиксированных списков: Статусы заказа, цвета, категории — хорошие примеры.
  • Атрибут [Flags] только для комбинируемых значений: Не используйте его для обычных перечислений.

Пример в контексте backend-разработки

В backend часто используются enum для статусов операций, типов событий, кодов ошибок.

public enum OrderStatus
{
    Pending = 1,
    Processing = 2,
    Shipped = 3,
    Delivered = 4,
    Cancelled = 5
}

// В модели заказа
public class Order
{
    public int Id { get; set; }
    public OrderStatus Status { get; set; }
}

// В бизнес-логике
if (order.Status == OrderStatus.Pending)
{
    // Можно начать обработку
}

Enum — это мощный инструмент для создания строго типизированных, читаемых и безопасных констант в C#. Его правильное использование значительно снижает количество ошибок, связанных с "магическими числами", и улучшает архитектуру кода, особенно в сложных backend-системах, где важна четкость определений состояний и режимов работы.