Зачем нужен enum в C# и когда его использовать?
Изучаю C# и наткнулся на enum. Понимаю, что это какие-то именованные константы, но не до конца ясно, зачем оно нужно, если можно просто использовать числа или строки.
Когда стоит заводить enum, а когда нет? И как с ним работать на практике?
// вот так писал раньше
int status = 1; // что значит 1? непонятно
2 ответа
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] и степени двойки.
Дополню про обратное преобразование и про [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