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

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


Зміст


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

 


Зв’язані теми