Перечисления enum в C#

  • Михаил
  • 8 мин. на прочтение
  • 164
  • 30 May 2023
  • 30 May 2023

Перечисления enum в C# - это специальный тип данных, который представляет собой набор именованных констант. Они используются для ограничения значений переменной до определенного набора допустимых значений. Кроме примитивных типов данных в языке программирования C# есть такой тип как enum или перечисление. Перечисления представляют набор логически связанных констант. Объявление перечисления происходит с помощью оператора enum:

enum название_перечисления
{
    // значения перечисления
    значение1,
    значение2,
    .......
    значениеN
}

После оператора enum идет название перечисления. И затем в фигурных скобках через запятую перечисляются константы перечисления.

Вот основные особенности перечислений enum в C#:

1. Объявление: Перечисление объявляется с помощью ключевого слова enum следующим образом:

  enum DayOfWeek { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }

В этом примере мы создали перечисление DayOfWeek с семью константами-членами. Каждое перечисление фактически определяет новый тип данных, с помощью которых мы также, как и с помощью любого другого типа, можем определять переменные, константы, параметры методов и т.д. В качестве значения переменной, константы и параметра метода, которые представляют перечисление, должна выступать одна из констант этого перечисления, например:

2. Значения: По умолчанию первый элемент перечисления имеет значение 0, а каждый последующий элемент увеличивается на 1. Вы можете явно задать значения для элементов перечисления:

  enum Color { Red = 1, Green = 2, Blue = 3 }

3. Типизация: Перечисления являются строго типизированными, то есть могут принимать только значения, объявленные в перечислении. Переменная типа DayOfWeek может принимать только значения из списка Monday, Tuesday, Wednesday и т.д.

4. Операции: Над перечислениями можно выполнять различные операции, такие как сравнение, арифметические операции и логические операции.

5. Преобразование типов: Значения перечисления можно преобразовывать в другие типы, например, в int или string, и наоборот.

6. Получение значений: Можно получить значение элемента перечисления, используя его имя, или наоборот, получить имя элемента по его значению.

Вот пример использования перечисления DayOfWeek:

DayOfWeek today = DayOfWeek.Monday;
Console.WriteLine(today); // Output: Monday
int dayNumber = (int)today; // dayNumber = 0
DayOfWeek anotherDay = (DayOfWeek)2; // anotherDay = Wednesday
if (today == DayOfWeek.Monday)
{
   Console.WriteLine("It's the beginning of the week!");
}

Перечисления очень полезны, когда вам нужно ограничить набор допустимых значений для переменной. Они помогают повысить читаемость, надежность и безопасность кода.

Хранение состояния

Зачастую переменная перечисления выступает в качестве хранилища состояния, в зависимости от которого производятся некоторые действия:

DayTime now = DayTime.Evening;
PrintMessage(now);                   // Добрый вечер
PrintMessage(DayTime.Afternoon);    // Добрый день
PrintMessage(DayTime.Night);        // Доброй ночи
void PrintMessage(DayTime dayTime)
{
    switch (dayTime)
    {
        case DayTime.Morning:
            Console.WriteLine("Доброе утро");
            break;
        case DayTime.Afternoon:
            Console.WriteLine("Добрый день");
            break;
        case DayTime.Evening:
            Console.WriteLine("Добрый вечер");
            break;
        case DayTime.Night:
            Console.WriteLine("Доброй ночи");
            break;
    }
}
enum DayTime
{
    Morning,
    Afternoon,
    Evening,
    Night
}

Здесь метод PrintMessage() в качестве параметра принимает значение типа перечисления DayTime и зависимости от этого значения выводит определенное приведение.

Другой пример:

DoOperation(10, 5, Operation.Add);          // 15
DoOperation(10, 5, Operation.Subtract);     // 5
DoOperation(10, 5, Operation.Multiply);     // 50
DoOperation(10, 5, Operation.Divide);       // 2
void DoOperation(double x, double y, Operation op)
{
    double result = op switch
    {
        Operation.Add => x + y,
        Operation.Subtract => x - y,
        Operation.Multiply => x * y,
        Operation.Divide => x / y
    };
    Console.WriteLine(result);
}
enum Operation
{
    Add,
    Subtract,
    Multiply,
    Divide
}

Здесь определено перечисление Operation, которое представляет арифметические операции. Каждый тип операций определен в виде одной из констант перечисления. И также определен метод DoOperation(), который в качестве параметров принимает два числа и тип операции в виде константы перечисления и в зависимости от этого типа возвращает из конструкции switch результат определенной операции.

Тип и значения констант перечисления

Константы перечисления могут иметь тип. Тип указывается после названия перечисления через двоеточие:

enum Time : byte
{
    Morning,
    Afternoon,
    Evening,
    Night
}

Тип перечисления обязательно должен представлять целочисленный тип (byte, sbyte, short, ushort, int, uint, long, ulong). Если тип явным образом не указан, то по умолчанию используется тип int.

Тип влияет на значения, которые могут иметь константы. По умолчанию каждому элементу перечисления присваивается целочисленное значение, причем первый элемент будет иметь значение 0, второй - 1 и так далее. Например, возьмем выше определенное DayTime:

DayTime now = DayTime.Morning;
Console.WriteLine((int) now);  // 0
Console.WriteLine((int) DayTime.Night);  // 3
enum DayTime
{
    Morning,
    Afternoon,
    Evening,
    Night
}

Мы можем использовать операцию приведения, чтобы получить целочисленное значение константы перечисления:

(int) DayTime.Night // 3

В то же время, несмотря на то, что каждая константа сопоставляется с определенным числом, мы НЕ можем присвоить ей числовое значение:

DayTime now = 2;    // ! Ошибка

Можно также явным образом указать значения элементов, либо указав значение первого элемента:

enum DayTime
{
    Morning = 3,    // каждый следующий элемент по умолчанию увеличивается на единицу
    Afternoon,      // этот элемент равен 4
    Evening,        // 5
    Night           // 6
}

Но можно и для всех элементов явным образом указать значения:

enum DayTime
{
    Morning = 2,
    Afternoon = 4,
    Evening = 8,
    Night = 16
}

При этом константы перечисления могут иметь одинаковые значения, либо даже можно присваивать одной константе значение другой константы:

enum DayTime
{
    Morning = 1,
    Afternoon = Morning,
    Evening = 2,
    Night = 2
}