Выбрать главу

При построении какой-либо системы часто удобно создавать набор символических имен, которые отображаются на известные числовые значения. Например, в случае создания системы начисления заработной платы может возникнуть необходимость в ссылке на типы сотрудников с применением констант вроде VicePresident (вице-президент), Manager (менеджер), Contractor (подрядчик) и Grunt (рядовой сотрудник). Для этой цели в C# поддерживается понятие специальных перечислений. Например, далее представлено специальное перечисление по имени EmpTypeEnum (его можно определить в том же файле, где находятся операторы верхнего уровня, если определение будет помещено в конец файла):

using System;

Console.WriteLine("**** Fun with Enums *****\n");

Console.ReadLine();

// Здесь должны находиться локальные функции:

// Специальное перечисление.

enum EmpTypeEnum

{

  Manager,      // = 0

  Grunt,        // = 1

  Contractor,   // = 2

  VicePresident // = 3

}

На заметку! По соглашению имена типов перечислений обычно снабжаются суффиксом Enum. Поступать так необязательно, но подобный подход улучшает читабельность кода.

В перечислении EmpTypeEnum определены четыре именованные константы, которые соответствуют дискретным числовым значениям. По умолчанию первому элементу присваивается значение 0, а остальным элементам значения устанавливаются по схеме n+1. При желании исходное значение можно изменять подходящим образом. Например, если имеет смысл нумеровать члены EmpTypeEnum со значения 102 до 105, тогда можно поступить следующим образом:

// Начать нумерацию со значения 102.

enum EmpTypeEnum

{

  Manager = 102,

  Grunt,        // = 103

  Contractor,   // = 104

  VicePresident // = 105

}

Нумерация в перечислениях не обязана быть последовательной и содержать только уникальные значения. Если (по той или иной причине) перечисление EmpTypeEnum необходимо сконфигурировать так, как показано ниже, то компиляция пройдет гладко и без ошибок:

// Значения элементов в перечислении не обязательно должны

// быть последовательными!

enum EmpType

{

  Manager = 10,

  Grunt = 1,

  Contractor = 100,

  VicePresident = 9

}

Управление хранилищем, лежащим в основе перечисления

По умолчанию для хранения значений перечисления используется тип System.Int32 (int в языке С#); тем не менее, при желании его легко заменить. Перечисления в C# можно определять в похожей манере для любых основных системных типов (byte, short, int или long). Например, чтобы значения перечисления EmpTypeEnum хранились с применением типа byte, а не int, можно записать так:

// На этот раз для элементов EmpTypeEnum используется тип byte.

enum EmpTypeEnum : byte

{

  Manager = 10,

  Grunt = 1,

  Contractor = 100,

  VicePresident = 9

}

Изменение типа, лежащего в основе перечисления, может быть полезным при построении приложения .NET Core, которое планируется развертывать на устройствах с небольшим объемом памяти, а потому необходимо экономить память везде, где только возможно. Конечно, если в качестве типа хранилища для перечисления указан byte, то каждое значение должно входить в диапазон его допустимых значений. Например, следующая версия EmpTypeEnum приведет к ошибке на этапе компиляции, т.к. значение 999 не умещается в диапазон допустимых значений типа byte:

// Ошибка на этапе компиляции! Значение 999 слишком велико для типа byte!

enum EmpTypeEnum : byte

{

  Manager = 10,

  Grunt = 1,

  Contractor = 100,

  VicePresident = 999

}

Объявление переменных типа перечисления

После установки диапазона и типа хранилища перечисление можно использовать вместо так называемых "магических чисел". Поскольку перечисления — всего лишь определяемые пользователем типы данных, их можно применять как возвращаемые значения функций, параметры методов, локальные переменные и т.д. Предположим, что есть метод по имени AskForBonus(), который принимает в качестве единственного параметра переменную EmpTypeEnum. На основе значения входного параметра в окно консоли будет выводиться подходящий ответ на запрос о надбавке к зарплате.