Перечисления в С#
Перечисляемый тип (также называемый перечислением) — это тип данных, состоящий из набора именованных значений. Переменной, перечисляемого типа,
может быть присвоен любой из элементов перечисления в качестве значения, в результате чего код станет более читабельным.
Перечисления определяются с помощью ключевого слова enum.
enum TaskPriority
{
Low,
Normal,
High
}
По умолчанию значения членов перечисления имеют тип int. Они начинаются с нуля и увеличиваются на единицу.
Но для перечисления можно определить и другие типы, включая byte, sbyte, short, ushort, uint, long, и ulong.
Также перечисления создаются в стеке, а не в куче.
Простой пример перечисления C
Ниже приведен простой пример с перечислением.
Day day = Day.Monday;
if (day == Day.Monday)
{
Console.WriteLine("Это понедельник");
}
Console.WriteLine(day);
// выводим значения членов перечисления
foreach (int i in Enum.GetValues(typeof(Day)))
{
Console.WriteLine(i);
}
// Создаем перечисление для дней недели.
enum Day
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
Тестируем программу в консоли:
$ dotnet run
It is Monday
Monday
0
1
2
3
4
5
6
Также мы можем указать собственные значения для членов перечисления.
foreach (int i in Enum.GetValues(typeof(Day)))
{
Console.WriteLine(i);
}
enum Day
{
Monday = 10,
Tuesday = 11,
Wednesday = 12,
Thursday = 13,
Friday = 14,
Saturday = 15,
Sunday = 16
}
В примере мы предоставляем значения от 10 до 16 членам Dayперечисления.
$ dotnet run
10
11
12
13
14
15
Перечисления с типом данных отличных от int
В следующем примере мы изменим тип данных для членов перечисления.
// теперь тип значений не int, а byte
// время года
enum Season : byte
{
Spring = 1,
Summer = 2,
Autumn = 3,
Winter = 4
}
Season s1 = Season.Spring;
Season s2 = Season.Autumn;
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine("#############################################");
Console.WriteLine(s1.GetType()); // тип переменной перечисления
Console.WriteLine(Enum.GetUnderlyingType(s1.GetType())); // тип, лежащий в основе значений перечисления
Выполним в консоли:
$ dotnet run
Spring
Autumn
#############################################
Season
System.Byte
Преобразования перечислений в C
Можно выполнять явные преобразования между типом перечисления и лежащим в его основе целочисленным типом.
enum Priority
{
Low,
Normal,
High
}
var p1 = Priority.Low;
// конвертируем значение перечисления в его целочисленное представление
Console.WriteLine($"Численной значение {p1} равно {(int) p1}");
// конвертируем число в элемент перечисления, соответствующий этому числу
var p2 = (Priority) 1;
Console.WriteLine(p2);
// конвертируем число в элемент перечисления, соответствующий этому числу
var p3 = (Priority) 2;
Console.WriteLine(p3);
$ dotnet run
Численной значение Low равно 0
Normal
High
Флаги перечислений
С помощью атрибута [Flags] перечисление можно превратить в битовое поле. Затем это перечисление можно использовать в качестве набора флагов.
(Значения этих членов перечисления должны быть степенью двойки.)
Далее мы можем использовать побитовые логические операторы | или & для комбинирования вариантов.
var readWrite = Permissions.Read | Permissions.Write;
Console.WriteLine(readWrite);
[Flags]
enum Permissions
{
Execute = 0b_0000_0001,
Write = 0b_0000_0010,
Read = 0b_0000_0100
}
В примере мы определяем разрешение на чтение и запись с помощью оператора |.
$ dotnet run
Write, Read
Таким образом в данной статье мы рассмотрели основы работы с перечислениями в C#.