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

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


Содержание


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

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

 

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. Какие преимущества дает использование перечислений в программе?

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

  • повысить понимание и читабельность программного кода;
  • уменьшить количество вероятных ошибок в программе.

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

 

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();

 


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