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

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

Перечисления определяются с помощью ключевого слова 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#.

Источник