Перечисления

Перечисления (enum)


Содержание


1. Что называется перечислением в языке C#?

Перечисления в языке C# представляют собой набор (последовательность) констант, которые образуют тип данных. Значение каждой константы задается именем.  В языке C# перечисления представлены классом. Все перечисления наследуются от класса System.Enum.

 

2. Какая общая форма объявления типа «перечисление»? Ключевое слово enum

Общая форма объявления типа перечисление имеет вид:

enum имя { список_констант };

где

  • имя – это имя (название) типа перечисления;
  • список_констант – список идентификаторов, разделенных запятой.

 

3. В каких местах программы можно объявлять тип «перечисление»

Тип «перечисление» можно объявлять в пределах пространства имен, в пределах класса. В теле метода объявить тип «перечисление» не удастся.

 

4. Примеры объявления перечислений и их использование в программе

Пример 1. Объявление типа Month, определяющее перечень месяцев года.

// Объявить тип Month
enum Month
{
    January, February, March, April, May, June,
    July, August, September, October, November, December
}

Использование типа Month в другом программном коде (например, обработчике события)

// использование перечисления в программном коде
Month M; // Объявление переменной M типа "перечисление"
M = Month.January; // M = January

int m;
m = (int)M; // m = 0

M = Month.August; // M = August
m = (int)M; // m = 7

Пример 2. Объявление типа DayWeek, содержащего информацию о дне недели.

enum DayWeek
{
    Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}

Пример использования составных операторов присваивания с переменной типа DayWeek:

DayWeek D;

D = DayWeek.Sunday;
D++; // D = Monday
D += 2; // D = Wednesday
D += 10; // D = 13

D = DayWeek.Friday;
--D; // D = Thursday
D = D - 8; // D = -4

 

5. Как осуществляется инициализация перечисления? Пример

Пример 1. Инициализация перечисления типа Month, в котором каждый месяц инициализируется значением, равным количеству дней в этом месяце.

Объявление перечисления:

// Объявить тип Month
enum Month
{
    January = 31, February = 28, March = 31, April = 30, May, June = 30,
    July, August = 31, September = 30, October, November = 30, December
}

Демонстрация использования переменной типа Month

Month M;
int days;

M = Month.December; //
days = (int)M; // days = 31

M = Month.October;
days = (int)M; // days = 31

M = Month.February;
days = (int)M; // days = 28

Пример 2. Объявление перечисления, в котором день недели имеет свой номер, начиная с понедельника. Демонстрируется правило: каждой следующей константе присваивается значение, которое на 1 больше значения предшествующей инициализированной константы.

Объявление перечисления типа DayWeek

enum DayWeek
{
    Sunday = 7, Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday
}

Демонстрация использования в программе

DayWeek DW; // переменная типа DayWeek
DW = DayWeek.Saturday;

// Определение того, выходной день или рабочий
if ((DayWeek.Monday <= DW) && (DW <= DayWeek.Friday))
    label1.Text = "Рабочий день";
else
    label1.Text = "Выходной день";

DW = DayWeek.Thursday;
int num = (int)DW; // num = 4
num = (int)DayWeek.Tuesday; // num = 2

 

6. Какой базовый тип по умолчанию имеют константы в перечислении?

По умолчанию, базовым типом для констант в перечислении есть тип int.

 



7. Каким образом можно изменить базовый тип констант в «перечислении»?

Чтобы изменить базовый тип констант с int на другой, нужно указать этот тип сразу после имени перечисления. Общая форма такого объявления будет иметь вид:

enum имя : новый_тип { список_констант };

где

  • имя – это имя (название) типа перечисления;
  • новый_тип – собственно, новый тип, который устанавливается вместо базового типа;
  • список_констант – список идентификаторов, разделенных запятой.

Пример. Приводится объявление типа, который определяет оценки по дисциплинам. В объявлении перечисления константы получают тип byte.

enum Marks : byte
{
    unsatisfactory = 2, satisfactory, good, excellent
}

Использование переменной типа Marks в программе

Marks M;

M = Marks.good;
byte b;

b = (byte)M; // b = 4
b = (byte)Marks.excellent; // b = 5

 

8. Какие преимущества дает использование перечислений в программе?

Использование перечислений есть эффективным, если в программе часто используются константы, которые имеют символические обозначения. Использование перечислений вместо числовых значений имеет следующие преимущества:

  • повышение понимания и читабельности программного кода, поскольку обращение происходит не к числам, а к смысловым именам;
  • улучшение контроля допустимости имен и их значений. Использование перечислений гарантирует, что переменные будут иметь значения из ожидаемого (допустимого) набора значений. Если попробовать присвоить не описанное в перечислении значение, то компилятор выдаст ошибку;
  • экономия времени программиста. При использовании имен система IntelliSense отображает удобный список всех допустимых имен в перечислении. Достаточно только выбрать нужное значение из списка;
  • расширение функционала. Поскольку перечисления наследуются от класса System.Enum, то к ним добавляется несколько полезных методов реализованных в этом классе;
  • уменьшение количества вероятных ошибок в программе.

Также, использование перечислений позволяет сгруппировать наборы констант в единое целое с целью дальнейшего оперирования ими. Это, в свою очередь, упорядочивает программный код и уменьшает риск допущения ошибки программистом.

 

9. Пример использования перечисления с оператором switch

В примере приводится использование перечисления Month для определения количества дней в месяце.

Пусть заданы объявления перечисления Month

// Объявить тип Month
enum Month
{
    January, February, March, April, May, June,
    July, August, September, October, November, December
}

Использование переменной типа Month в программе

// Определение количества дней в месяце
Month M;
int n_days;

M = Month.November;

switch (M)
{
    case Month.February: n_days = 28;
    break;
    case Month.April:
    case Month.June:
    case Month.September:
    case Month.November: n_days = 30;
    break;
    default: n_days = 31;
    break;
}

// вывод на форму
label1.Text = n_days.ToString();

 


Связанные темы