Помимо ранее рассмотренных примитивных типов данных, в 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).