Перечисления в C# - C# и .NET

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

Перечисления (enum) — это пользовательский тип данных, представляющий собой набор именованных целочисленных констант. Перечисления часто используются в программировании, когда нам необходимо объединить ряд значений, которые можно описать целым числом и, при этом, использование массива неоправданно или нецелесообразно.

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

Зачем нужны перечисления в C#

Довольно часто, при разработке программ на C#, мы даем сделать пользователю какой-либо выбор, который можно описать в приложении одним целым числом. Например, мы можем предложить пользователю выбрать тип операции, которые необходимо произвести с двумя числами: сложить, поделить, умножить и так далее. Всем этим операциям можно присвоить в программе целочисленные значения, например:

  • 1 – сложить
  • 2 – умножить
  • 3 – поделить

Теперь с каждым числом у нас связана конкретная операция и, если пользователь после нашего запроса “выберите операцию” введет в консоли, например, цифру 3, то мы будем понимать, что он хочет поделить два числа. Сравнить два числа всегда проще, чем две строки. Как минимум потому, что строку можно написать по-разному (большими буквами, маленькими, с ошибкой или без), а целое число – оно и в Африке целое число.

Здесь цифры 1, 2, 3 и их строковые представления (названия операций) связаны между собой логически. Чтобы их хранить, мы можем завести шесть отдельных переменных (3 для цисел и 3 для строк), можем завести два одномерных или один двумерный массив, а можем поступить проще – определить внутри нашей программы – перечисление и работать с одной переменной типа перечисление.

Как определяются перечисления в C#

Чтобы объявить перечисление в своем приложении необходимо использовать ключевое слово enum и придерживаться следующего правила:

enum Название_типа : целочисленный_тип
{
    имена_констант_через_запятую
}

Вначале идет ключевое слово enum, которое указывает на то, что тип данных относится к перечислениям. Далее идет Название_типа — это может быть любая строка допустимая для использования в именах переменных C#. После названия через двоеточие указывается тип данных для констант в перечислении, если тип не указан, то по умолчанию используется тип int. И, наконец, в фигурных скобках через запятую указываются имена констант для перечисления.

Например, ниже представлено перечисление, содержащее дни недели:

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

Теперь, мы можем объявить переменную этого типа и использовать её в приложении, например, так:

Days days = Days.Monday; //объявили переменную и присвоили е значение
//объявили новый тип данных - перечисление
enum Days
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

Значения констант в enum

Перечисления в C# — это набор именованных целочисленных констант. По умолчанию связанные значения констант элементов перечисления имеют тип int. Они начинаются с нуля и увеличиваются на единицу в соответствии с порядком текста определения. Чтобы убедиться в этом, достаточно написать, например, вот такой код:

Console.WriteLine($"{nameof(Days.Monday)} = {(int)Days.Monday}");
Console.WriteLine($"{nameof(Days.Tuesday)} = {(int)Days.Tuesday}");
Console.WriteLine($"{nameof(Days.Wednesday)} = {(int)Days.Wednesday}");
Console.WriteLine($"{nameof(Days.Thursday)} = {(int)Days.Thursday}");
Console.WriteLine($"{nameof(Days.Friday)} = {(int)Days.Friday}");
Console.WriteLine($"{nameof(Days.Saturday)} = {(int)Days.Saturday}");
Console.WriteLine($"{nameof(Days.Sunday)} = {(int)Days.Sunday}");

//объявили новый тип данных - перечисление
enum Days
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}
nameof(...) — это выражение, с помощью которого можно получить имя переменной в виде строки. В результате мы увидим следующий вывод в консоли:
Перечисления в C#
При этом, мы можем изменить значения констант как нам угодно (но только в рамках используемого для констант типа данных). Например, мы можем задать вот такие значения для наших констант:
enum Days {
   Monday = 5,
   Tuesday = 7,
   Wednesday = 10,
   Thursday = 18,
   Friday = 25,
   Saturday = 48,
   Sunday = 64
}

Можем указать свой собственный тип данных для констант:

enum Days : short
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 5,
    Friday = 5,
    Saturday = -1,
    Sunday = -2
}

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

enum Days : byte
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 5,
    Friday = 5,
    Saturday = 1,
    Sunday = Saturday + 2
}

Здесь Thursdayи Fridayиспользуют одно и тоже значение константы, а для определения значения Sundayиспользуется значение константы Saturday.

Пример использования перечислений

Рассмотрим следующий пример использования перечислений в C#

Console.WriteLine("Введите первое целое число:");
int num1 = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Введите второе целое число:");
int num2 = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("0 - сложение");
Console.WriteLine("1 - вычитание");
Console.WriteLine("2 - умножение");
Console.WriteLine("3 - деление");

Operation operNum = (Operation)Convert.ToInt32(Console.ReadLine());
switch (operNum)
{
    case Operation.Add:
        {
            Console.WriteLine($"{num1} + {num2} = {num1 + num2}");
            break;
        }
    case Operation.Subtract:
        {
            Console.WriteLine($"{num1} - {num2} = {num1 - num2}");
            break;
        }
    case Operation.Multiply:
        {
            Console.WriteLine($"{num1} * {num2} = {num1 * num2}");
            break;
        }
    case Operation.Divide:
        {
            Console.WriteLine($"{num1} / {num2} = {(double)num1 / num2}");
            break;
        }
}

enum Operation
{
    Add,
    Subtract,
    Multiply,
    Divide
}

Вначале мы просим ввести пользователя два целых числа. Далее, пользователь выбирает одну из четырех операций — сложение, вычитание, умножение, деление и вводит число от 0 до 3, соответствующее выбранной операции. Тип перечисления описан ниже —Operation. Здесь стоит обратить внимание на следующую строку:

Operation operNum = (Operation)Convert.ToInt32(Console.ReadLine());

здесь мы, во-первых, получаем из строки число — Convert.ToInt32(Console.ReadLine()), а, во-вторых присваиваем переменной operNum значение из перечисления Operation, соответствующее этому числу. Чтобы было понятнее, то же самое действие мы могли бы расписать в коде более подробно, используя промежуточную переменную:

int op = Convert.ToInt32(Console.ReadLine());//получили число от 0 до 3
Operation operNum = (Operation)op; //получили значение из Operation

Далее мы, используя оператор выбора switch определяем, что необходимо выполнить с полученными числами и сразу выводим результат пользователю:

switch (operNum)
{
    case Operation.Add:
        {
            Console.WriteLine($"{num1} + {num2} = {num1 + num2}");
            break;
        }
    case Operation.Subtract:
        {
            Console.WriteLine($"{num1} - {num2} = {num1 - num2}");
            break;
        }
    case Operation.Multiply:
        {
            Console.WriteLine($"{num1} * {num2} = {num1 * num2}");
            break;
        }
    case Operation.Divide:
        {
            Console.WriteLine($"{num1} / {num2} = {(double)num1 / num2}");
            break;
        }
}

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

Подведем итог

Перечисления (enum) — это пользовательский тип данных, представляющий собой набор именованных целочисленных констант. Используя перечисления в C#, мы можем удобно группировать ряд логически связанных констант в одном типе данных, присваивая каждой константе своё уникальное имя.

Домашнее задание

Создайте перечисление Days, содержащее дни недели. Пользователь вводит в консоль номер дня недели и программа должна вывести в консоль информацию – рабочий это день недели или выходной. Первый день недели – понедельник, последний рабочий день – суббота.