← Все вопросы

Зачем нужен enum в C# и когда его использовать?

Задан 4 месяца назад795 просмотров2 ответа
9

Изучаю C# и наткнулся на enum. Понимаю, что это какие-то именованные константы, но не до конца ясно, зачем оно нужно, если можно просто использовать числа или строки.

Когда стоит заводить enum, а когда нет? И как с ним работать на практике?

// вот так писал раньше
int status = 1; // что значит 1? непонятно

2 ответа

15
✓ Принятый ответ — помог автору

enum — это набор именованных целочисленных констант. Он нужен, чтобы код был читаемым и защищённым от опечаток: вместо «магического» числа 1 вы пишете осмысленное имя.

enum OrderStatus
{
    New,        // 0
    Paid,       // 1
    Shipped,    // 2
    Cancelled   // 3
}

OrderStatus status = OrderStatus.Paid;

if (status == OrderStatus.Paid)
    Console.WriteLine("Заказ оплачен");

По умолчанию значения нумеруются с нуля, но их можно задать явно:

enum HttpCode
{
    Ok = 200,
    NotFound = 404,
    ServerError = 500
}

int code = (int)HttpCode.NotFound; // 404

Когда использовать: когда у переменной есть ограниченный набор взаимоисключающих состояний (статус заказа, день недели, направление). Преимущества перед строками и числами: компилятор не даст присвоить произвольное значение, есть автодополнение в IDE, и легко получить имя через status.ToString().

Если же нужны флаги (несколько значений одновременно), добавьте атрибут [Flags] и степени двойки.

6

Дополню про обратное преобразование и про [Flags].

Из строки в enum:

OrderStatus s = Enum.Parse<OrderStatus>("Paid");
// безопасный вариант
if (Enum.TryParse("Paid", out OrderStatus result))
    Console.WriteLine(result);

Энам-флаги, когда нужно комбинировать значения:

[Flags]
enum Access
{
    None = 0,
    Read = 1,
    Write = 2,
    Execute = 4
}

Access a = Access.Read | Access.Write;
bool canWrite = a.HasFlag(Access.Write); // true

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект