Перечисления (enum) в C#: объявление, использование и лучшие практики
Что такое перечисление
Перечисление (enum) — набор именованных целочисленных констант. Объявляется ключевым словом enum. Перечисления — типы-значения (value types), не поддерживают наследование.
Синтаксис объявления
enum <ИмяПеречисления>
{
Идентификатор1,
Идентификатор2,
...
}
По умолчанию первый элемент = 0, каждый следующий = предыдущий + 1. Базовый тип — int (можно изменить: enum Day : byte).
Пример базового enum
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sun }; // Sun=0, Mon=1, ..., Sat=6
// Явное присваивание значений
enum StatusCode : byte
{
OK = 200,
NotFound = 404,
ServerError = 500
}
// Флаги (для битовых операций)
[Flags]
enum FileAccess
{
None = 0,
Read = 1, // 0b0001
Write = 2, // 0b0010
Execute = 4, // 0b0100
ReadWrite = Read | Write // 3
}
Работа с enum
Days today = Days.Mon;
int dayNumber = (int)today; // 1
// Парсинг из строки
Days parsed = Enum.Parse("Friday"); // Days.Fri
bool isValid = Enum.TryParse("Monday", out Days d); // true
// Получение всех значений
foreach (Days d in Enum.GetValues())
Console.WriteLine($"{d} = {(int)d}");
// Получение имён
string[] names = Enum.GetNames();
Атрибут [Flags]
Позволяет комбинировать значения побитово. Метод ToString() покажет комбинацию:
FileAccess access = FileAccess.Read | FileAccess.Write;
Console.WriteLine(access); // "Read, Write"
Console.WriteLine((int)access); // 3
// Проверка флага
bool canRead = (access & FileAccess.Read) != 0; // true
bool canExec = access.HasFlag(FileAccess.Execute); // false (C# 4.0+)
Преобразования
- Enum → int:
(int)myEnum(явное приведение) - int → Enum:
(MyEnum)value(явное, значение может не соответствовать ни одному элементу) - Enum → string:
myEnum.ToString()— имя константы - string → Enum:
Enum.Parse<T>(str)илиEnum.TryParse<T>(str, out var result)
Лучшие практики
- Используйте
enumдля небольших наборов связанных констант - Всегда задавайте явные значения, если они важны для сериализации/БД
- Используйте
[Flags]для битовых масок - Базовый тип выбирайте исходя из диапазона (
byte,short,int,long) - Избегайте отрицательных значений, если не нужно
- Для расширяемости рассмотрите
classс константами вместо enum
Пример из оригинала
using System;
namespace EnumApplication
{
class EnumProgram
{
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
static void Main(string[] args)
{
int weekDayStart = (int)Days.Mon; // 1
int weekDayEnd = (int)Days.Fri; // 5
Console.WriteLine($"Monday: {weekDayStart}");
Console.WriteLine($"Friday: {weekDayEnd}");
Console.ReadKey();
}
}
}
Результат:
Monday: 1
Friday: 5
Язык C
- C# Hello World — создание вашего первого C# приложения
- Понимание ключевых слов и идентификаторов C#: правила, списки и лучшие практики
- Мастерство C# переменных и примитивных типов данных: полное руководство
- Операторы C# — исчерпывающее руководство по операторам в C#
- Освоение побитовых и сдвиговых операторов в C#: полное руководство
- Основы ввода-вывода в C#: Console.WriteLine, ReadLine и форматирование
- Выражения, операторы и блоки в C#: подробное руководство с примерами
- Освоение комментариев в C#: виды, лучшие практики и XML-документация
- Освоение оператора switch в C#: синтаксис, примеры и лучшие практики
- Тернарный оператор в C#: краткое руководство по условным выражениям