Перерахування 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,
        Ukrainian
    }

    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.Ukrainian));
        }

        Console.ReadLine();
    }
}

Програма підтримує вивід назв на двох мовах: англійській та українській.

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

Дивіться також: