При написании программ часто возникает потребность определить несколько связанных между собой именованных констант, при этом их конкретные значения могут быть не важны. Для этого удобно воспользоваться перечисляемым типом данных, все возможные значения которого задаются списком целочисленных констант, например:
enum Menu { Read, Write, Append, Exit }
enum Радуга { Красный, Оранжевый, Желтый, Зеленый, Синий, Фиолетовый }
Для каждой константы задается ее символическое имя. По умолчанию константам присваиваются последовательные значения типа int, начиная с 0, но можно задать и собственные значения, например:
enum Nums { two = 2, three, four, ten = 10, eleven, fifty = ten + 40 };
Константам three и four присваиваются значения З и 4, константе eleven — 11. Имена перечисляемых констант внутри каждого перечисления должны быть уникальными, а значения могут совпадать.
Преимущество перечисления перед описанием именованных констант состоит в том, что связанные константы нагляднее; кроме того, компилятор выполняет проверку типов, а интегрированная среда разработки подсказывает возможные значения констант, выводя их список.
Синтаксис перечисления:
[ атрибуты ] [ спецификаторы ] enum имя_перечисления [: базовый_тип ] тело_перечисления [; ]
Спецификаторы перечисления имеют такой же смысл, как и для класса, причем Допускаются только спецификаторы new, public, protected, internal и private.
Базовый тип — это тип элементов, из которых построено перечисление. По умолчанию используется тип int, но можно задать тип и явным образом, выбрав его среди целочисленных типов (кроме char), а именно: byte, sbyte, short, ushort, int, uint, long и ulong. Необходимость в этом возникает, когда значения констант невозможно или неудобно представлять с помощью типа int.
Тело перечисления состоит из имен констант, каждой из которых может быть присвоено значение. Если значение не указано, оно вычисляется прибавлением единицы к значению предыдущей константы. Константы по умолчанию имеют спецификатор доступа public.
Перечисления часто используются как вложенные типы, идентифицируя значения из какого-либо ограниченного набора. Пример такого перечисления приведен в листинге 9.9.
Листинг 9.9. Пример перечисления
using System;
namespace ConsoleApplication1
{
struct Боец
{
public enum Воинское_3вание
{
Рядовой, Сержант, Майор, Генерал
}
public string Фамилия;
public Воинское_3вание Звание;
}
class Class1
{
static void Main()
{
Боец х;
x.Фамилия = "Иванов";
x.Звание = Боец.Воинское_3вание.Сержант;
Console.WriteLine(х.Звание + " " + х.Фамилия);
}
}
}
Результат работы программы:
Сержант Иванов
Перечисления удобно использовать для представления битовых флагов, например:
enum Flags: byte
{
b0, b1, b2, bЗ = 0x04, b4 = 0x08, b5 = 0x10, b6 = 0x20, b7 = 0x40
}