C#. Клас System.Enum. Зчислення (перелічення, перерахування)




Клас System.Enum. Зчислення (перелічення, перерахування)

Дана тема є взаємозв’язана з наступною темою:


Зміст


Пошук на інших ресурсах:

1. Клас System.Enum. Призначення. Огляд методів

Клас System.Enum є базовим класом для зчислень, що використовуються у програмі. Якщо оголосити зчислення за зразком

enum EnumType { constant1, constant2, ..., constantN };

то створюється тип даних з іменем EnumType, який містить строго визначені константні імена constant1, constant2, …, constantN.

Для екземпляру типу EnumType та й для будь-якого іншого екземпляру, оголошеного з ключовим словом enum, стають доступними (успадковуються) наступні методи базового класу System.Enum:

  • GetValues() – повертає масив значень констант у вказаному зчисленні у вигляді масиву типу System.Array;
  • GetName() – повертає одиночне значення заданої константи у заданому зчисленні як рядок типу string;
  • GetNames() – повертає масив імен констант типу string[] у вказаному зчисленні;
  • Parse() – конвертує рядкове представлення імені або числового значення однієї або декількох констант зчислення в еквівалентний зчислювальний об’єкт.

 

2. Методи класу System.Enum
2.1. Метод GetName(). Отримати значення константи у вигляді рядка. Приклад

Метод GetName() дозволяє отримати значення константи з деякого зчислення у вигляді рядка. Згідно з документацією загальна форма методу наступна:

public static string GetName(System.Type enumType, object value);

тут

  • System.Type – абстрактний клас, що представляє типи класів, інтерфейсів, масивів, значень, зчислень, параметрів, узагальнень;
  • enumType – тип зчислення, для якого потрібно отримати ім’я значення;
  • value – значення конкретної константи зі зчислення enumType.

Щоб в метод GetName() передати тип зчислення EnumType, потрібно використати засіб typeof() за зразком

typeof(EnumType)

При використанні методу можливі виключні ситуації наступних типів:

  • System.ArgumentNullException – виникає, коли значення enumType або value рівні null;
  • System.ArgumentException – виникає, коли значення enumType не є зчисленням або значення value не є типом enumType.

Приклад. У прикладі нижче отримується назва дня тижня, який встановлено у змінній d типу Days.

using System;

namespace ConsoleApp12
{
  class Program
  {
    // Зчислення, що визначає дні тижня
    enum Days { Mon, Tue, Wed, Thi, Fri, Sat, Sun };

    static void Main(string[] args)
    {
      // 1. Оголосити екземпляр зчислення
      Days d;

      // 2. Встановити день тижня вівторок
      d = Days.Tue;

      try
      {
        // 3. Отримати назву дня тижня у вигляді рядка
        string strDay = Enum.GetName(typeof(Days), d);

        // 4. Вивести назву дня тижня
        Console.WriteLine("strDay = {0}", strDay); // strDay = Tue
      }
      catch (System.ArgumentNullException e)
      {
        Console.WriteLine(e.Message);
      }
      catch(System.ArgumentException e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

 

2.2. Метод GetNames(). Отримати масив імен констант зчислення. Приклад

Метод GetNames() дозволяє отримати масив типу string[], що містить імена констант заданого зчислення. Згідно з документацією загальна форма методу наступна:

public static string[] GetNames(System.Type enumType);

тут enumType – тип зчислення, для якого потрібно отримати рядкове представлення його констант.

При використанні методу можуть виникнути виключні ситуації:

  • типу System.ArgumentNullException, якщо enumType рівне null;
  • типу System.ArgumentException, якщо enumType не є зчисленням типу System.Enum.

Приклад.

using System;

namespace ConsoleApp12
{
  class Program
  {
    // Зчислення, що описує оцінки
    enum Colors
    {
      Unsatisfactory = 2,
      Satisfactory = 3,
      Good = 4,
      Excellent = 5
    };

    static void Main(string[] args)
    {
      // 1. Оголосити змінну типу Colors
      Colors cl;

      // 2. Отримати імена зчислення cl
      try
      {
        string[] names;
        names = Enum.GetNames(typeof(Colors));

        // 3. Вивести імена зчислення cl
        foreach (string name in names)
          Console.WriteLine(name);
      }
      catch (System.ArgumentNullException e)
      {
        Console.WriteLine(e.Message);
      }
      catch (System.ArgumentException e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

Результат виконання програми

Unsatisfactory
Satisfactory
Good
Excellent

 

2.3. Метод GetValues(). Отримати масив значень констант зчислення. Приклад

Значення цілочисельних чи рядкових констант зі зчислення можна отримати з допомогою методу GetValues(), який має наступну загальну форму:

public static System.Array GetValues(System.Type enumType);

тут

  • System.Array – тип значень констант, що повертаються у вигляді динамічного масиву;
  • System.Type – абстрактний клас, що представляє типи класів, інтерфейсів, масивів, значень, зчислень, параметрів, узагальнень;
  • enumType – екземпляр зчислення типу System.Type.

При використанні методу можуть виникати виключні ситуації наступних типів:

  • System.ArgumentNullException – випадок, коли enumType==null;
  • System.ArgumentException – випадок, коли enumType не є зчисленням;
  • System.InvalidOperationException – випадок, коли метод є викликаний відображенням в контексті “тільки відображення” або enumType є типом збірки, яка відображається в контексті “тільки відображення”.

Приклад. У прикладі з допмогою методів GetValues() та GetNames() виводяться імена та значення констант зі зчислення, яке описує кількість днів у визначеній порі року.

using System;

namespace ConsoleApp12
{
  class Program
  {
    // Зчислення, що описує кількість днів у порі року.
    // Приймається, що в лютому 28 днів.
    enum Seasons
    {
      Winter = 90, Spring = 92, Summer = 92, Autumn = 91
    };

    static void Main(string[] args)
    {
      try
      {
        // 1. Оголосити змінну типу Seasons
        Seasons ss;

        // 2. Отримати значення констант зі зчислення ss
        Array values;
        values = Enum.GetValues(typeof(Seasons));

        // 3. Отримати імена зі зчислення ss
        string[] names = Enum.GetNames(typeof(Seasons));

        // 4. Вивести імена та значення зі зчислення ss
        for (int i = 0; i < names.Length; i++)
          Console.WriteLine("{0} = {1}", names[i], (int)values.GetValue(i));
      }
      catch (ArgumentNullException e)
      {
        Console.WriteLine(e.Message);
      }
      catch (ArgumentException e)
      {
        Console.WriteLine(e.Message);
      }
      catch (InvalidOperationException e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

Результат виконання програми

Winter = 90
Autumn = 91
Spring = 92
Summer = 92

 

2.4. Метод Parse(). Конвертувати рядкове представлення зчислення в об’єкт. Приклад

Метод Parse() дозволяє отримати окреме значення зі зчислення за його іменем. Метод має декілька перевантажених реалізацій. Згідно з документацією загальна форма деяких реалізацій методу наступна:

public static object Parse(System.Type enumType, string value);
public static object Parse(System.Type enumType, string value, bool ignoreCase)

тут

  • enumType – змінна типу зчислення;
  • value – рядкове представлення значення зі зчислення, яке потрібно конвертувати;
  • ignoreCase – прапорець, що визначає чи потрібно ігнорувати регістр символів (true).

При використанні методу можливі виключні ситуації наступних типів:

  • System.ArgumentNullException – випадок, коли enumType = null;
  • System.ArgumentException – генерується у випадках, коли enumType не є типу System.Enum або value не входить в перелік констант зчислення enumType;
  • System.OverflowException – значення є за межами діапазону типу enumType.

Приклад. У прикладі описується зчислення Corners, що містить кількість кутів популярної фігури. З допомогою методу Parse() демонструється визначення кількості кутів шестикутника (Hexagon). При звертанні до імені фігури у зчисленні, не враховується регістр символів.

using System;

namespace ConsoleApp12
{
  class Program
  {
    // Зчислення, що визначає кількість кутів у фігурі
    enum Corners
    {
      Triangle = 3, Circle = 0, Rectangle = 4, Hexagon = 6, Pentagon = 5
    };

    static void Main(string[] args)
    {
      try
      {
        // Отримати кількість кутів шестикутника, ігнорувати регістр символів
        int nCorners = (int)System.Enum.Parse(typeof(Corners), "HEXAGON", true);
        Console.WriteLine("nCorners = {0}", nCorners);
      }
      catch (ArgumentNullException e)
      {
        Console.WriteLine(e.Message);
      }
      catch(ArgumentException e)
      {
        Console.WriteLine(e.Message);
      }
      catch(StackOverflowException e)
      {
        Console.WriteLine(e.Message);
      }
    }
  }
}

Результат виконання програми

nCorners = 6

 

3. Приклад використання класу System.Enum для визначення кількості днів у заданому місяці

Умова задачі. Розробити програму, яка за введеним номером місяця виводить кількість днів у цьому місяці.

Розв’язок. З метою демонстрації, у програмі використовуються можливості класу System.Enum для отримання значень зі зчислення Months.

using System;

namespace ConsoleApp12
{
  class Program
  {
    // Оголошення типу зчислення Months, яке описує місяці року
    // всередині класу.
    // Jan = 1, Feb = 2, Mar = 3, Apr = 4 , ..., Dec = 12
    enum Months
    {
      Jan = 1, Feb, Mar, Apr, May, Jun,
      Jul, Aug, Sep, Oct, Nov, Dec
    };

    static void Main(string[] args)
    {
      // Вивести кількість днів у місяці,
      // використати змінну типу Enum
      Console.WriteLine("Enter number of month (1..12):");
      int month = Int32.Parse(Console.ReadLine());

      // перевірка, чи коректно введений місяць
      if ((month < 1) || (month > 12))
      {
        Console.WriteLine("Wrong input.");
        return;
      }

      Months MN; // змінна типу Months

      // Ініціалізувати MN значенням на основі змінної month.
      // Метод Enum.GetValues() повертає клас System.Array.
      // У класі System.Array є метод GetValue(), який повертає
      // значення об'єкту за індексом (0..11).
      MN = (Months)Enum.GetValues(typeof(Months)).GetValue(month - 1);

      switch (MN)
      {
        case Months.Feb:
          Console.WriteLine("28 (29) days");
          break;
        case Months.Apr:
        case Months.Jun:
        case Months.Sep:
        case Months.Nov:
          Console.WriteLine("30 days");
          break;
        default:
          Console.WriteLine("31 days");
          break;
      }
    }
  }
}

Результат виконання програми

Enter number of month (1..12):
5
31 days

 


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