Содержание
Перечисления (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(...) — это выражение, с помощью которого можно получить имя переменной в виде строки. В результате мы увидим следующий вывод в консоли:
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, содержащее дни недели. Пользователь вводит в консоль номер дня недели и программа должна вывести в консоль информацию – рабочий это день недели или выходной. Первый день недели – понедельник, последний рабочий день – суббота.