Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие NET.doc
Скачиваний:
26
Добавлен:
07.03.2016
Размер:
4.63 Mб
Скачать

9.7.1 Операції з переліченнями

Із змінними переліченого типу можна виконувати арифметичні операції ( +, - ++, --), логічні порозрядні операції (*, &, |, ~), порівнювати їх за допомогою операцій відношення (<, < =, >, >= = =, ! = ) і отримувати розмір в байтах (sizeof).

При використанні змінних переліченого типу в цілочисельних виразах і операціях привласнення потрібне явне перетворення типу. Змінній переліченого типу можна привласнити будь-яке значення, уявне за допомогою базового типу, тобто не тільки одне із значень, що входять в тіло перелічення. Привласнюване значення стає новим елементом перелічення.

Приклад:

Flags а = Flags.b2 | Flags.b4;

Console.WriteLine( "а = {0} {0,2:Х}", а );

++а;

Console.WriteLine( "а = {0} {0.2:X}", а );

int х = (int) а;

Console.WriteLine( "x = {0} {0.2:X}", x );

Flags b = (Flags) 65;

Console.WriteLine( "b = {0} {0.2:X}", b );

Результат роботи цього фрагмента програми ( {0,2:х} позначає шістнадцятирічний формат виведення):

a = 10 0A

a = 11 0B

x = 11 B

b = 65 41

Інший приклад використання операцій з переліченнями приведений в лістингу 9.11.

Лістинг 9.11. Операції з переліченнями

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace examp64

{

struct Боец

{

public enum Воинское_Звание

{ Рядовой, Сержант, Лейтенант, Майор, Полковник, Генерал }

public string Фамилия;

public Воинское_Звание Звание;

}

class Program

{

static void Main(string[] args)

{

Боец x;

x.Фамилия = " Иванов";

x.Звание = Боец.Воинское_Звание.Сержант;

for (int i = 1976; i < 2006; i += 5)

{

if (x.Звание < Боец.Воинское_Звание.Генерал) ++x.Звание;

Console.WriteLine("Рік: {0} {1} {2}", i, x.Звание, x.Фамилия);

}

}

}

}

Результат роботи програми:

Рік 1976 Лейтенант Иванов

Рік 1981 Майор Иванов

Рік 1986 Полковник Иванов

Рік 1991 Генерал Иванов

Рік 1996 Генерал Иванов

Рік 2001 Генерал Иванов

9.7.2. Базовий клас System.Enum

Всі перелічення в С# є нащадками базового класу System.Enum, який забезпечує їх деякими корисними методами.

Статичний метод GetName дозволяє отримати символічне ім'я константи по її номеру, наприклад:

Console.WriteLine( Enum.GetName(typeof( Flags ),8)); // b4

Console.WriteLine(Enum.GetName(typeof(Боец.Воинское_Звание ),1)); //Сержант

Статичні методи GetNames і GetValues формують, відповідно, масиви імен і значень констант, складових перелічення, наприклад:

Array names = Enum.GetNames(typeof(Flags));

Console.WriteLine("Кількість елементів в переліченні: " + names.Length );

foreach (string elem in names) Console.Write(" " + elem);

Array values = Enum.GetValues(typeof(Flags));

foreach (Flags elem in values ) Console.Write(" " + (byte) elem);

Статичний метод IsDefined повертає значення true, якщо константа із заданим символічним ім'ям описана у вказаному переліченні, і false в іншому випадку, наприклад:

if (Enum.IsDefined(typeof(Flags), "b5"))

Console.WriteLine("Константа з ім'ям b5 існує " );

else Console.WriteLine("Константа з ім'ям b5 не існує " );

Статичний метод GetUnderlyingType повертає ім'я базового типу, на якому побудовано перелічення. Наприклад, для перелічення Flags буде отримано System.Byte:

Console.WriteLine(Enum.GetUnderlyingType(typeof(Flags) ) );