Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

c# events | evenimente in c# (.Net)

    In stransa legatura cu facilitatea delegate a limbajului C#, prezentam evenimentele, events.

   Cele mai multe evenimente sunt actiuni ale utilizatorilor (click, schimbarea unei liste, introducere de text, sfarsitul unui calcul etc).

    In .Net, obiectele cunoscute ca si event senders, declanseaza evenimente atunci cand au loc actiuni. Event receivers se ocupa de aceste evenimente prin rularea unei metode numite event handler. Pentru ca event sender-ul nu stie care metoda se va ocupa de eveniment, trebuie creat un delegate care sa se comporte ca un pointer catre event handler.

    Pentru a produce un eveniment, trebuie sa parcurgem 3 pasi : sa declaram un delegate, sa construim un obiect eveniment, sa apelam delegatul intr-o metoda.

    Pentru a raspunde la un eveniment, e nevoie de doi pasi: trebuie sa construim o metoda, metoda care trebuie sa se potriveasca signaturii delegatului. Doi, e nevoie sa adauga un event handler care sa indice care metoda trebuie sa primeasca evenimentele.

    Declararea unui eveniment se face prin folosirea cuvantului cheie event.

event delegat-eveniment nume-obiect;

delegat-eveniment – numele delegatului folosit pentru tratarea evenimentului;

nume-obiect – numele instantei eveniment;

Exemplu:

    //declaram un delegate
    //pentru tratarea evenimentului
    delegate void DelegatTratareEveniment();

    Deoarece evenimentele au delegati multicast, tipul rezultatului va fi void. Pentru acest exemplu, nu exista parametri, dar evenimentele pot accepta parametri.

Construim o clasa in care definim o instanta eveniment.

    class Eveniment
    { 
        //declaram evenimentul
        public event DelegatTratareEveniment activat;
        //metoda apelata la lansarea evenimentului
        public void Actiune()
        {
            if (activat != null)
            //lansam evenimentul
            activat();
        }
    }

    Metoda Actiune va fi apelata de program pentru a semnala un eveniment si apeleaza rutina de tratare a evenimentului prin intermediul delegatului activat, daca si numai daca acesta nu este null (verificam faptul ca delegatul nu este null pentru ca este posibil ca metoda Actiune sa fie apelata inainte de inregistrarea rutinei de tratare).

    In clasa Program a proiectului, construim rutina de tratare numita handler, care in acest exemplu simplu doar va afisa un mesaj.

    //rutina de tratare
    static void handler()
    {
        Console.WriteLine("Eveniment produs");
    }

In metoda Main, construim o instanta a clasei Eveniment, iar metoda handler este inregistrata ca rutina de tratare a evenimentului.

    //crearea instantei eveniment
    Eveniment ev = new Eveniment();
    //adaugam handler-ul la lista de evenimente
    ev.activat += new DelegatTratareEveniment(handler);

Lansam evenimentul:

    //lansam evenimentul
    ev.Actiune();

Apelul metodei determina apelul rutine de tratare.

Multicast

Multicast in conceptul evenimentelor permite mai multor obiecte sa raspunda la instiintarea aparitiei unui eveniment.

Exemplu:

    Scriem acelasi cod pentru declararea unui delegat si pentru declararea clasei Eveniment.

    Adaugam inca doua clase, a caror rutine de tratare nu sunt statice, deci va trebuie sa creeam instante pentru clasele respective.

    class A
    {
        public void AHandler()
        {
            Console.WriteLine("Eveniment primit de un obiect A");
        }
    }

    class B
    {
        public void BHandler()
        {
            Console.WriteLine("Eveniment primit de un obiect B");
        }
    }

In clasa Program, adaugam doar in metoda Main:

    //crearea instantelor
    A a = new A();
    B b = new B();

    //adaugam rutinele de tratare la lisa de evenimente
    ev.activat +=new DelegatTratareEveniment(a.AHandler);
    ev.activat += new DelegatTratareEveniment(b.BHandler);

    //lansam evenimentul
    ev.Actiune();
    //eliminarea unei rutine de tratare
    ev.activat -= new DelegatTratareEveniment(a.AHandler);

   Ca observatie valabila pentru evenimente in acest exemplu : evenimentele sunt destinate instantelor si nu claselor in general.

   In .Net, mai toate evenimentele sunt implementate folosind delegati multicast, care au doi parametri (unul de tip object – care reprezinta obiectul care provoaca evenimentul, iar celelalt de tip EventArgs care contine data utilizabile in tratarea evenimentului).

   Putem construi evenimente in interiorul claselor, iar la declansarea lor ne putem da seama unde s-a ajuns cu procesarea codului.

   Suportul pentru delegate si evenimente permite gestionarea complexitatii programarii pe obiecte intr-un mod mai usor.

Exemplul prezentat in acestarticol poate fi downloadat aici.

Category: Uncategorized
  • Timotei Dolean says:

    De mentionat la partea asta, ca in momentul in care se distruge un obiect, legaturile catre evenimente NU se distrug, deca va trebui sa apelezi: -= intr-un destructor, altfel se vor tot apela si mai departe.

    February 11, 2010 at 10:21 pm
  • zeltera says:

    Multumesc pentru completare.

    February 11, 2010 at 11:13 pm
  • Marian says:

    Draga Domnule,

    Multumesc !
    Ai facut o treaba foarte buna cu acest “Tutorial c#”.
    Tocmai lucrez la o aplicatie client-server si mi-a fost de folos sa frunzaresc modul dvs . simplu, clar, bine exprimat (organizat) de a prezenta conceptele si m-a ajutat sa clarific unele chestiuni neclare.
    Consider ca tutorialul dvs. ar trebui publicat (tiparit) sau pus in format pdf pentru download, fiind unul dintre cele mai straight-thru pentru programatori c# mai sus de :P “gezna broastei”.

    Sincere salutari !

    July 15, 2011 at 2:37 pm
    • zeltera says:

      Multumesc pentru aprecieri.

      M-am gandit intr-o perioada sa il transform intr-un pdf, insa nu am gasit timp pentru asta. Poate intr-un viitor cu mai mult timp liber, desi, din experienta de pana acum, programare si timp liber nu prea merg impreuna!

      July 15, 2011 at 3:01 pm
  • Alex says:

    Multumesc pentru exemplu. Hit and run, scurt si la obiect.

    Alex

    December 3, 2011 at 3:50 pm

Your email address will not be published. Required fields are marked *

*