CS-Opas:Delegaatit ja tapahtumankäsittelijät

Mureakuha

Loikkaa: valikkoon, hakuun
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;
	}
}
Henkilökohtaiset työkalut