петак, 17. јун 2016.

Događaji u C# programskom jeziku


Event – događaj u C# programskom jeziku je način da klasa ili objekat pruži obaveštenje drugim klasama ili objektima da se nešto važno dogodilo. Klasa koja generiše događaj naziva se publisher – izdavač dok klasa koja prima ili obrađuje događaj se naziva subcriber – pretplatnik. Klasa publisher definiše kad će se generisati događaj dok klasa subscriber odlučuje koja će se akcija preduzeti. Obično klasa pretplatnik sadrži čitavu listu metoda koji se pozivaju kad se izazove događaj i takve metode takođe zovemo subscribers - pretplatničke metode. Kada programeri rade sa događajima, uglavnom se to odnosi na programiranje aplikacije sa grafičkim okruženjem ili web aplikacijama, zato što su takve aplikacije vođene događajima. Na primer kad god vi kliknete na neku stavku u meniju ili neko dugme na formi mišem; vi zapravo aktivirate određeni događaj i na osnovu pokrenutog događaja se izvršava kod koji se nalazi u proceduri događaja za stavku menija ili dugmeta koje ste pritisnuli. Kako će ceo tok programa da se izvršava zavisi od događaja koje korisnik aktivira sve do izlaska iz aplikacije. Zato kažemo da su navedene aplikacije vođene događajima. Događaji se retko koriste u konzolnim aplikacijama ali i u njima mogu da imaju svoju primenu.


( Događaji u C# programskom jeziku )

Deklaracija događaja je jednostavna, stime da su događaji namenjeni da se koriste sa delegatima. Jednostavno tip događaja mora da bude delegat i zato ispred delegata mora da se nalazi ključna reč event. U .Net Framework-u su događaji bazirani na EventHandler delegatu. O delegatima čitajte ovde, a sintaksa za deklarisanje događaja je sledeća:


event DelegatDogadjaja imeDogadjaja;

Kao i kod delegate, pretplata na događaj se vrši operatorom +=

ImeDogadjaja += new DelegatDogadjaja (ImeMetode);

Dok se odjava, otkazivanje pretplate vrši operatorom -=

ImeDogadjaja -= new DelegatDogadjaja (ImeMetode);

Pre generisanja događaja se uvek proverava da li događaj ima null vrednost:

if (ImeDogadjaja != null)
{
    ImeDogadjaja.Invoke();

}

Događaje će te najbolje naučiti koristeći praktične primere. Pogledajte jedan od njih.

Praktičan primer događaja

Događaje možete da koristite za mnoga dešavanja na primer u igricama. U sledećm primeru samo jedan događaj se koristi da upali određena svetla na semaforima. Taktičnije bi bilo da događaj baziramo na vremenu da se događaj aktivira na svakih 5 sekundi, međutim u ovom primeru mi koristimo događaj da aktiviramo određenu boju na semaforima radi razumevanja pretplate i odjave događaja. Pogledajte kako to izgleda u sledećem primeru:

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

namespace Events
{
    public delegate void TrafficLight(byte traffic);

    class Program
    {
        public static event TrafficLight trafficLight;

       
        static void Main(string[] args)
        {
            WriteLine("The Crossroads with four traffic lights in the game!" + Environment.NewLine);

            trafficLight += new TrafficLight(RedLight);

            Status(1, 3);

            trafficLight -= new TrafficLight(RedLight);
            trafficLight += new TrafficLight(GreenLight);

            Status(2, 4);

            WriteLine();

            Thread.Sleep(5000);


            trafficLight -= new TrafficLight(GreenLight);
            trafficLight += new TrafficLight(YellowLight);

            Status(1, 3);
            Status(2, 4);

            WriteLine();

            Thread.Sleep(5000);

            trafficLight -= new TrafficLight(YellowLight);
            trafficLight += new TrafficLight(GreenLight);

            Status(1, 3);

            trafficLight -= new TrafficLight(GreenLight);
            trafficLight += new TrafficLight(RedLight);

            Status(2, 4);

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

        }

        static void GreenLight(byte traffic)
        {
            WriteLine($"Traffic Light number {traffic} : Green Traffic Light");

        }

        static void YellowLight(byte traffic)
        {
            WriteLine($"Traffic Light number {traffic} : Yellow Traffic Light");

        }

        static void RedLight(byte traffic)
        {
            WriteLine($"Traffic Light number {traffic} : Red Traffic Light");

        }

        static void Status(byte t1, byte t2)
        {
            if (trafficLight != null)
            {
                trafficLight.Invoke(t1);
                trafficLight.Invoke(t2);

            }          
        }
    }
}

Kada pokrenete program, prvi semafor i preko puta njega treći semafor iz suprotnog pravca će imati upaljena crvena svetla. Zatim će se u istoj sekundi događaj odjaviti sa crvenog svetla i pretplatiti se na događaj sa zelenim svetlima i u isto vreme upaliti zelena svetla semaforima dva i četiri sa leve i desne strane.

The Crossroads with four traffic lights in the game!

Traffic Light number 1 : Red Traffic Light
Traffic Light number 3 : Red Traffic Light
Traffic Light number 2 : Green Traffic Light
Traffic Light number 4 : Green Traffic Light 


Zatim će posle 5 sekundi se događaj odjaviti i sa zelenog svetla i preplatiti se na žuto svetlo. Ali će ovaj put dvaput pozvati metodu Status sa svim brojevima semafora kako bi svi semafori imali u isto vreme žuto svetlo.

Traffic Light number 1 : Yellow Traffic Light
Traffic Light number 3 : Yellow Traffic Light
Traffic Light number 2 : Yellow Traffic Light
Traffic Light number 4 : Yellow Traffic Light


I posle sledećih 5 sekundi, događaj će se odjaviti sa žutog svetla, zatim prijaviti na zeleno svetlo i upaliti na prvom i trećem semaforu. Zatim se u isto vreme odjaviti sa zelenog svetla i pretplatiti na crveno svetlo koje će proslediti semaforima drugom i četvrtom.

Traffic Light number 1 : Green Traffic Light
Traffic Light number 3 : Green Traffic Light
Traffic Light number 2 : Red Traffic Light
Traffic Light number 4 : Red Traffic Light

Press any key to continue...


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



( C# 6.0 Tutorial - Advanced - 43. Event )