Вдобавок к структурам в .NET имеется еще один тип из категории характеризуемых значением – это
// Пользовательский перечень.
enum EmpType {
Manager, // = 0
Grunt, // = 1
Contractor, // = 2
VP // = 3
}
Перечень EmpType определяет четыре именованные константы, соответствующие конкретным числовым значениям. В C# схема нумерации по умолчанию предполагает начало с нулевого элемента (0) и нумерацию последующих элементов по правилам арифметической прогрессии n + 1. При необходимости вы имеете возможность изменить такое поведение на более удобное.
// начало нумерации со значения 102.
enum EmpType {
Manager = 102,
Grunt, // = 103
Contractor, // =104
VP // = 105
}
Перечни не обязаны следовать строгому последовательному порядку нумерации элементов. Если (по некоторой причине) вы сочтете разумным создать EmpType так, как показано ниже, компилятор примет это без возражений.
// Элементы перечня не обязаны следовать в строгой последовательности!
enum EmpType {
Manager = 10,
Grunt = 1,
Contractor = 100,
VP = 9
}
Тип, используемый для каждого элемента в перечне, по умолчанию отображается в System.Int32. Такое поведение при необходимости тоже можно изменить. Например, если вы хотите, чтобы соответствующее хранимое значение EmpTyре было byte, а не int, вы должны написать следующее.
// Теперь EmpType отображается в byte.
enum EmpType: byte {
Manager = 30,
Grunt = 1,
Contractor = 100,
VP = 9
}
Замечание. Перечни в C# могут определяться в унифицированной форме для любого из числовых типов (byte, sbyte, short, ushort, int, uint, long или ulong). Это может быть полезно при создании программ для устройств с малыми объемами памяти, таких как КПК или сотовые телефоны, совместимые с .NET.
Установив диапазон и тип хранения для перечня, вы можете использовать его вместо так называемых "магических чисел". Предположим, что у вас есть класс, определяющий статическую функцию с единственным параметром EmpType.
static void AskForBonus(EmpType e) {
switch(e) {
case EmpType.Contractor:
Console.WriteLine("Вам заплатили достаточно…");
break;
case EmpType.Grunt:
Console.WriteLine("Вы должны кирпичи укладывать…");
break;
case EmpType.Manager:
Console.WriteLine("Лучше скажите, что там с опционами!");
break;
case EmpType.VP:
Console.WriteLine("ХОРОШО, сэр!");
break;
default:
break;
}
}
Этот метод можно вызвать так.
static void Main(string[] args) {
// Создание типа contractor.
EmpType fred;
fred = EmpType.Contractor;
AskForBonus(fred);
}
Замечание. При ссылке на значение перечня всегда следует добавлять префикс имени перечня (например, использовать EmpType.Grunt, а не просто Grunt).
Базовый класс System.Enum
Особенностью перечней .NET является то, что все они неявно получаются из System.Enum. Этот базовый класс определяет ряд методов, которые позволяют опросить и трансформировать перечень. В табл. 3.9 описаны некоторые из таких методов, и все они являются статическими.
Таблица 3.9. Ряд статических членов System.Enum