понедељак, 26. март 2018.

Enumeracije ili nabrajanje tipa Enum u C# programskom jeziku


Enumerations - enumeracije su specijalni vrednosni tipovi podataka koji omogućava da zadate grupu imenovanih numeričkih konstanti. U Srbiji se enumeracija često naziva nabrajanje, ali onda je bolje da kažete nabrajanje tipa enum jer postoje i druge vrste nabrajanja u C# programskom jeziku. Programeri C++ programskog jezika ponekad nazivaju enumeraciju skraćeno enums. Zašto enums, zašto ne enum? Zato što je enum skraćenica od ENUM - Electronic number – elektronski broj; što je opet predlog za mapiranje svih telefonskih brojeva u IP adrese.


( Enumeracija čini vaš kod čitljivijim )

Zato je neophodno obratiti pažnju kada pričate sa kolegama o enumeracijama. Inače kada hoćete da deklarišete enumeraciju u C# programskom jeziku; koristite ključnu reč enum izvan funkcija kao što to radite sa strukturama.

enum ime_enumeracije
{
    vrednost1,
    vrednost2,
   
}

Jednom kad ste deklarisali enumeraciju, možete da je koristite na tačno isti način kao i bilo koji drugi numerički tip podataka. Vrednostima enumeracije možete dodeljivati jedino celobrojnu vrednost. Ukoliko želite vrednostima enumeracije da dodeljujete vrednosti tipa stringova, onda bolje razmislite o tome da koristite strukturu u kojoj će nabrajanje biti jedan od članova strukture. Nabrajanje pružaju funkcionalnost garantovanih fiksnih vrednosti i kad se koriste kao indikatori.

Kako se dodeljuju vrednosti strukturi enumeracija?


Jednostavno, ako vrednostima niste dodelili nikakvu celobrojnu vrednost, onda se podrazumeva da nabrajanje počinje od 0 kao i u nizovima.

enum ime_enumeracije
{
    vrednost1 = 0,
    vrednost2 = 1,
   
}

Međutim ukoliko vi dodate neku vašu celobrojnu vrednost, posle nje će svaka vrednosti biti uvećana za 1. Npr.

enum ime_enumeracije
{
    vrednost1 = 1,
    vrednost2,
   
}

To znači da je u ovom slučaju vrednost2 jednaka 2, sledeća vrednost bi imala vrednost 3 itd. Vi možete imati iste vrednosti u stavkama enumeracije ali ne vidim poentu zašto bi ste to radili. Enumeracije su po defaultu tipa integer ali vi možete to promeniti u drugi celobrojni tip podataka.

enum ime_enumeracije : byte { ... }

Enumeraciju možete da prikažete kao nulabilnu vrednost na sledeći način:

Month? month = null;

Pogledajte kako se upotrebljava enumeracija u jednom jednostavnom primeru gde koristimo nazive meseci da ispišemo iste na engleskom, srpskom i hrvatskom jeziku.

using System;
using System.Collections.Generic;
using static System.Console;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Enumerations
{
    class Program
    {
        enum Month
        {
            January = 1,
            February,
            March,
            April,
            May,
            June,
            July,
            August,
            September,
            October,
            November,
            December

        }

        static void Main(string[] args)
        {
            Month? month = null;
            month = Month.January;

            string monthSRP = String.Empty;
            string monthHRV = String.Empty;

            for (int i = 0; i < (int)Month.December; i++)
            {
                switch (month)
                {
                    case Month.January:
                        monthSRP = "Januar";
                        monthHRV = "Sijecanj";
                        break;
                    case Month.February:
                        monthSRP = "Februar";
                        monthHRV = "Veljaca";
                        break;
                    case Month.March:
                        monthSRP = "Mart";
                        monthHRV = "Ozujak";
                        break;
                    case Month.April:
                        monthSRP = "April";
                        monthHRV = "Travanj";
                        break;
                    case Month.May:
                        monthSRP = "Maj";
                        monthHRV = "Svibanj";
                        break;
                    case Month.June:
                        monthSRP = "Jun";
                        monthHRV = "Lipanj";
                        break;
                    case Month.July:
                        monthSRP = "Juli";
                        monthHRV = "Srpanj";
                        break;
                    case Month.August:
                        monthSRP = "Avgust";
                        monthHRV = "Kolovoz";
                        break;
                    case Month.September:
                        monthSRP = "Septembar";
                        monthHRV = "Rujan";
                        break;
                    case Month.October:
                        monthSRP = "Oktobar";
                        monthHRV = "Listopad";
                        break;
                    case Month.November:
                        monthSRP = "Novembar";
                        monthHRV = "Studeni";
                        break;
                    case Month.December:
                        monthSRP = "Decembar";
                        monthHRV = "Prosinac";
                        break;
                   
                }

                SetCursorPosition(10, i + 1);
                WriteLine(month);
                SetCursorPosition(30, i + 1);
                WriteLine(monthSRP);
                SetCursorPosition(50, i + 1);
                WriteLine(monthHRV);
                month++;

            }

            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();

        }
    }
}

Kad pokrenete navedeni program dobićete sledeći rezultat:


          January                 Januar              Sijecanj
          February               Februar            Veljaca
          March                    Mart                 Ozujak
          April                      April                 Travanj
          May                       Maj                    Svibanj
          June                       Jun                    Lipanj
          July                        Juli                    Srpanj
          August                  Avgust                Kolovoz
          September            Septembar         Rujan
          October                Oktobar             Listopad
          November             Novembar         Studeni
          December             Decembar          Prosinac

Press any key to continue...

Strukturu switch case ne morate sami da pišete sve, možete da koristite trik da vam struktura switch case uradi to automatski pritiskom tastera Enter. Pogledajte kako se to radi u video-u istog primera.


( C# 6.0 Tutorial - Fundamentals - 22. Enumerations )



Kako se mogu nabrajanja međusobno kombinovati?

Članovi nabrajanja se kombinuju pomoću operatora nad bitovima kao što su | i &. Moraju imati eksplicitno zadate vrednosti. Praksa je da to budu stepeni broja 2 i mora im se pridružiti atribut Flags. Najbolje pogledajte sledeći primer.

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EnumerationsWithFlags
{
    class Program
    {
        [Flags]
        enum Shoot : byte
        {
            None = 0,
            Up = 1,
            Left = 2,
            Right = 4,
            Down = 8
        }

        static void Main(string[] args)
        {
            Shoot shootUpLeft = Shoot.Up | Shoot.Left;
            Shoot shootUpRight = Shoot.Up | Shoot.Right;

            string shoot = String.Empty;
            if (shootUpLeft != 0)
            {
                shoot = shootUpLeft.ToString();
                WriteLine($"\t Shoot Up-Left : {shoot}");

            }

            if (shootUpRight != 0)
            {
                shoot = shootUpRight.ToString();
                WriteLine($"\t Shoot Up-Right : {shoot}");

            }

            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();
        }
    }
}

Kao što vidite u navedenom primeru enumeracija se upotrebljava za pucanje rakete u igrici, gde ona može da puca levo, desno, gore i dole. Ali kombinacijom dve stavke enumeracije gore i levo, raketa može da puca u gornji levi ugao ili kombinacijom desno i gore, raketa može da puca u desni gornji ugao. U navedenom programu smo prvoj stavci eksplicitno dodelili vrednost 0 dok smo ostale stepenovali na drugu što je praksa kada koristite atribut Flags. Kad pokrenete navedeni primer, dobićete sledeći rezultat:

         Shoot Up-Left : Up, Left
         Shoot Up-Right : Up, Right

Press any key to continue...

Kako navedeni program radi možete pogledati i na video-u:


 ( C# 6.0 Tutorial - Fundamentals - 23. Enumerations with Flags )