Изброеният тип () е конструкция, наподобяваща клас, в която обаче можем да декларираме само логически свързани константи.

Изброените типове могат да приемат стойности само измежду изброените в типа константи. Променлива от изброен тип може да има за стойност някоя измежду изброените в типа стойности (константи), но не може да има стойност null.

Изборен тип (enumeration / enum), като понятие в компютърната наука Изборен тип на колекция от елементи представлява подреден списък с всички елементи от тази колекция. Този тип колекции навлиза в информатиката от комбинаториката и по-точно изброителната комбинаторика, която се занимава с изброяването на начините по които дадена структура може да бъде подредена. Класически примери за това е пресмятането на пермутации и вариации. В статистиката се нарича още статистическа съвкупност, това е съвкупност от голям брои случаи.

В повечето съвременни езици(обектно ориентирани) за програмиране се използва изборен тип, който се представя в паметта на компютъра, като подреден списък от константи. Ползването на константи вместо просто променливи, има положителен ефект върху чистотата и прилежността на програмния код, което е една от основните причини за въвеждането на изборен тип в информатиката. Използване на изброен тип се среща в програмни езици като C#, Java и други.

Изборен тип в C# Изброените типове в C# се декларират с помощта на запазената дума enum и се състоят от множество именувани константи. Наследяват типа System. Enum. Вътрешно се представят с int, но може да се зададе и друг числов тип. Силно типизирани са – превръщат се в int експлицитно.

Декларация на enum в C# В общия случай:

[<modifiers>] enum <enum_name> { constant1[=value1] [, constant2[=value2]] [, ...] }

Обяснение на параметрите: <modifiers> – незадължителен параметър, който определя нивото на достъп до параметрите в дадена конструкция. Примери за modifier са public, private, protected, internal. <enum_name> – име на блока. Задължително поле, което се използва всеки път, когато искаме да използваме някоя от константите, декларирани в тялото на нашия блок. Важно при избора на име е спазването на правилата за имена на класове в C# (за повече информация C# Help). costant – самите константи. Те са задължителна част от декларацията на нашия блок. Отделят се една от друга със запетая и са от тип – името на нашия блок(enum_name). value – опционален параметър в случаите, в които искаме да декларираме числова константа. Приемат се за константи само цели числа.

Пример за декларация на константи с дните от седмицата:

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

В този случай константите в блока са от тип Days!

Всяка константа в един изброен тип представлява текстово представяне на някакво цяло число. По подразбиране, това число е индексът на константата в списъка от константи на изброения тип. Тази числова стойност може да бъде променена като по време на декларацията присвоим стойността, която предпочитаме, на всяка една от константите:

enum CarsManufactureDates { PorscheCarrera = 2001, MercedesBenzCLS = 2006, AlfaRomeoSpiderJTS = 2009 }

Извикване на константи от блок enum Примера за извикване на константи, използвайки блока дефиниран по-горе:

//Декларираме клас с помощта на който ще извикаме enum блока CarsManufactureDates. public class CarShop { public CarsManufactureDates date;

public CarShop(CarsManufactureDates date) { this.date = date;

public CarsManufactureDates Date { get { return date; }

static void Main() { //Създаваме два нови класа от туп CarShop. CarShop myCar = new CarShop(CarsManufactureDates.PorscheCarrera); CarShop mySecondCar = new CarShop(CarsManufactureDates.AlfaRomeoSpiderJTS);

//Ако не конвертираме към int ще получим името на нашата константа вместо стойността(value). Console.WriteLine("My first car is manufactured in {0}. ", (int)myCar.Date); Console.WriteLine("My second cars name is {0}. ", mySecondCar.Date); }

При компилиране на горния код получаваме следния резултат:

My first car is manufactured in 2001. My second cars name is PorscheCarrera.

Изброен тип с битови флагове Изброеният тип може да се използва за дефиниране на битови флагове, които позволяват променлива от изброен тип да съдържа комбинация от стойностите, които са дефинирани в изпроения списък. Изброеният тип с битови флагове се създава чрез използването на атрибута System. FlagsAttribute и задаване на подходящи стойности на константите, така че върху тях да могат да се приложат побитови операции като AND, OR, NOT and XOR.

В примера по-долу е дефиниран изброен тип Days2. Типът има Flags атрибут и на всяка константа е присвоена следващата по-висока степен на двойката:

[Flags] enum Days2 { None = 0, //0x0 Sunday = 1, //0x1 Monday = 2, //0x2 Tuesday = 4, //0x4 Wednesday = 8, //0x8 Thursday = 16, //0x10 Friday = 32, //0x20 Saturday = 64 //0x40 } class MyClass { Days2 meetingDays = Days2.Tuesday | Days2.Thursday; }

За сетване на флаг на enum се използва побитовата операция OR:

// Инициализиране с два флага meetingDays = Days2.Tuesday | Days2.Thursday;

// Сетване на допълнителен флаг meetingDays = meetingDays | Days2.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);

Meeting days are Tuesday, Thursday, Friday

Изтриване на флаг се извършва чрез побитовата операция XOR: meetingDays = meetingDays ^ Days2.Tuesday; Console.WriteLine("Meeting days are {0}", meetingDays);

Meeting days are Thursday, Friday

Проверка за това дали даден флаг е сетнат се прави с побитовата операция AND: bool test = (meetingDays & Days2.Thursday) == Days2.Thursday; Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");

Thursday is a meeting day.

Изброен тип в Java Изброеният тип може да се дефинира, както и в езика C#, по следния начин:

public enum Currency {USD, EUR, BGN, GBP};

Инстанция на изброен тип се създава, когато някоя от константите се извика за първи път в кода.

На константите могат да бъдат присвоени стойности по време на създаване:

public enum Currency {USD(1), EUR(5), BGN(10), GBP(25)};

За да работи това присвояване, е нужно да се дефинира член-променлива и конструктор, тъй като, например BGN(10), вика конскруктор, който приема int стойност:

public enum Currency { USD(1), EUR(5), BGN(10), GBP(25); private int value; private Currency(int value){ this.value = value;

Конструкторите трябва да са с модификатор за достъп private. За достъпване на стойностите, асоциирани с всяка константа, може да се дефинира публичен метод getValue() в самия изброен тип, подобно на дефиниране на метод в клас:

public enum Currency { USD(1), EUR(5), BGN(10), GBP(25); private int value; private Currency(int value){ this.value = value; } public int getValue(){ return code;

За разлика от C# в езика Java, изброеният тип може да има конструктор, инстансни полета и методи.

Изброен тип в C/C++ Декларацията на изброения тип в C и C++ става по подобен на предходните начин (опростена схема): enum [идентификатор] [клас|структура] {елементи};

Идентификаторът е името на изброения тип. Класът и структурата са незадължителни спецификатори, а елементите са поредицата от елементи за дадения изборен тип.

enum Months{ January, February, April, May, June, June, July, August, September, October, November, December};

Всяка стойност от изброения тип става енумератор, т.е. има своя стойност, съответстваща на нейната позиция. По подразбиране стойностите започват от 0, но може да бъде зададена и ръчно, като всяка следваща се увеличава с единица:

enum Months{ January = 1, February, March April, May, June, June, July, August, September, October, November, December};

Така February ще е със стойност 2, March ще е с 3 и т.н.

Всяка стойност от изброения тип се третира като константа и трябва да бъде уникална за него.

Има малка разлика в декларирането в C и C++. В C ключовата дума enum е задължителна, докато в C++ тя може да бъде пропусната

Източници 1. MSDN – the Microsoft Developer Network/Enumeration Type 2. Книга Въведение в програмирането със C#

Категория:Комбинаторика Категория:Математическа логика Категория:Програмиране