CS-Opas:Delegaatit ja tapahtumankäsittelijät
Mureakuha
- Teknisistä rajoituksista johtuen artikkelin yllä näkyvä otsikko on virheellinen. Oikea otsikko on C#-opas: Delegaatit ja tapahtumankäsittelijät.
Sisällysluettelo |
Delegaatti tyyppi
Delegaattien avulla voidaan määrittää kutsuttava metodi. Javassa tapahtumat toteutettiin luokilla, jotka toteutti tietyt rajapinnan, mutta .NETissä ei enää tarvitse luokkia tätä varten kirjoittaa. Delegaatit ovat sekä selkeitä, että helppokäyttöisempiä. Delegaatteja käytetään runsaasti ikkunoita ohjelmoitaessa, joissa kaikki tapahtumat (eventit - OnClick, OnLoad yms.) nostavat delagaattityyppisen tapahtuman.
Esimerkki
using System; //Delegaattityypin määrittely //Palauttaa double tyypin ja ottaa yhden double tyypin public delegate double Delegaattini(double c); public class D { public static void Main() { //Esitellään delegaatti muuttuja Delegaattini yksiD = null; //Esimerkki luokka D d = new D(); //Lisätään kutsuttava metodi muuttujaa huom: += merkintä yksiD += new Delegaattini(d.Arvoja); //Käytetään delegaattia double a = yksiD(45); //Tulostetaan koe Console.WriteLine("{0}",a); } public double Arvoja(double arvo) { return arvo/56; } }
Event
event-avainsanaa käytetään delegaattityypisten muuttujien kanssa. Event on tarkempi käyttöehtojensa suhteen. Siinä missä edellisen esimerkin yksiD muuttujana olisi voinut koska tahansa olla null, niin event avainsanan jälkeen tämä tuottaisi virheen. Event avainsanalla määritetyt muuttujat tarkistetaan ohjelman käännösvaiheessa, että luokan ulkopuolella käytetään vain += ja -= operaattoreita.
Esimerkki
using System; //Delegaattityypin määrittely //Palauttaa double tyypin ja ottaa yhden double tyypin public delegate double Delegaattini(double c); public class D { //Esitellään delegaattimuuttuja tapahtumana public event Delegaattini yksiD; public static void Main() { //Esimerkkiluokan ilmentymä D d = new D(); //Toinen olio, jolle D:n metodi annetaan D e = new D(); //Lisätään kutsuttava metodi muuttujaa huom: += merkintä e.yksiD += new Delegaattini(d.Arvoja); //Käytetään delegaattia double a = e.yksiD(45); //Tulostetaan koe Console.WriteLine("{0}",a); } public double Arvoja(double arvo) { return arvo/56; } public double Toinen(double j) { return j+1; } }
