Окрім раніше розглянутих примітивних типів даних, в 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).