Перечисления enum

Помимо ранее рассмотренных примитивных типов данных, в C# существует отдельный тип enum или перечисление, который состоит из списка именованных констант.

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

Синтаксис объявления перечисления следующий:

[modifier enum] EnumName [: type]
{
    ConstName1 [= value1],
    ConstName2 [= value2],
    ConstNameN [= valueN]
}

Первым идет необязательный модификатор, дальше после ключевого слова enum необходимо указать имя перечисления, после имени может идти необязательный тип данных, если тип не указан, то константы будут иметь тип данных – int(тип по умолчанию). В фигурных скобках, через запятую, указываются имена констант, которым можно назначить значения, при этом сразу несколько констант могут иметь одно и то же значение. Если значения констант не заданы, то они получают значения по умолчанию.

Логика присваивания значения по умолчанию:

  • Если для первой константы не указано значение, то тогда ей присваивается 0;
  • Если константе не задано значение, то ей присваивается значение на единицу больше предыдущего, даже если в последующих константах это значение используется.

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

  • byte;
  • sbyte;
  • short;
  • ushort;
  • int;
  • uint;
  • long;
  • ulong.

Рассмотрим перечисления на реальном примере, напишем enum для хранения названий цифр двоичной системы:

enum BinaryDigit
{
    Zero,  //0
    One   //1
}

В данном случае enum имеет тип данных по умолчанию(int), и поскольку значения для констант не заданы, всем присваиваются значения начиная с нуля, в итоге получаем соответствие цифр их названиям.

Рассмотрим ещё один пример:

enum Status : byte
{
    Error = 10,
    InProgress, //11
    Done = 77
}

В этом перечислении задан тип данных byte, при этом константе InProgress будет присвоено значение 11, так как оно вычисляется по предыдущему.

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

enum Color
{
    Blue = 1,
    Black, //В данном случае Black == White == 2.
    White = 2
}

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

using System;

namespace ConsoleApp
{
    enum BinDigit : uint
    {
        Zero,
        One
    }

    class Program
    {
        enum LedBulbColor : int
        {
            WarmWhite = 3500,
            White = 4200,
            CoolWhite = 6100
        }

        static void Main(string[] args)
        {
            BinDigit d;
            d = BinDigit.One;
            d = BinDigit.Zero;
            var ledBulb = LedBulbColor.CoolWhite;
            Console.WriteLine(d);        //Zero
            Console.WriteLine(ledBulb);  //CoolWhite
            Console.ReadLine();
        }
    }
}

Хотя константа перечисления связана с числовым значением, на экран выводятся текстовые названия констант. Для того чтобы получить целочисленное значение константы, нужно преобразовать её тип:

var x = (uint) BinDigit.One; //1

Где используются перечисления

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

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

using System;

namespace ConsoleApp
{
    class Program
    {
        enum TrafficLight
        {
            Red,
            Yellow,
            Green
        }

        static void Main(string[] args)
        {
            var t = TrafficLight.Green;            
            Console.WriteLine(t);
            Console.ReadLine();
        }
    }
}

Также перечисления удобно использовать в операторе switch. Рассмотрим в качестве примера программу для вывода названий цветов модели CMY:

using System;
class Program
{
    enum CMYColor
    {
        Cyan,
        Magenta,
        Yellow
    }

    enum Language
    {
        English,
        Russian
    }

    private static string CMYToText(CMYColor c, Language lang)
    {
        var s = string.Empty;
        if (lang == Language.English)
        {
            s = c.ToString();
        }
        else
        {
            switch (c)
            {
                case CMYColor.Cyan:
                    s = "Голубой";
                    break;
                case CMYColor.Magenta:
                    s = "Пурпурный";
                    break;
                case CMYColor.Yellow:
                    s = "Желтый";
                    break;
            }
        }
        return s;
    }

    static void Main(string[] args)
    {
        for (int i = 0; i < 3; i++)
        {
            //конвертируем int в enum
            var myColor = (CMYColor)i;
            Console.WriteLine(CMYToText(myColor, Language.Russian));
        }

        Console.ReadLine();
    }
}

Программа поддерживает вывод названий цветов на двух языках: английском и русском.

Перечисления активно используются в разных типах программ, для ограничения количества вариантов и улучшения читабельности кода. К примеру в консольных и Windows Forms приложениях доступны перечисления которые описывают цвета(ConsoleColor и Color) и клавиши клавиатуры(ConsoleKey и Keys).

Смотрите также: