Delegate
I delegate sono dei tipi che consentono delle chiamate di metodo indirette.
Una istanza di delegate contiene un puntatore ad un certo numero di metodi, e l'invocazione del delegate, consente la chiamata del metodo.
Per chi conoscesse C++, i Delegate corrispondono alle funzioni di callback.
Per utilizzare i Delegate occorre fare tre cose:
- Dichiararli
- Instanziarli
- Richiamarli
Dichiarare ed istanziare un Delegate
Vediamo un esempio:
using System;
public class Sample
{
public delegate string metodoDelegate(int numero);
public class classeDelegate
{
public string controllaSegno(int numero)
{
if (numero = 0)
return("uguale di zero");
else if (numero < 0)
return("Minore di zero");
else
return ("uguale a zero");
}
}
public static void Main()
{
classeDelegate c = new classeDelegate();
metodoDelegate d = new metodoDelegate(c.controllaSegno);
int[] numeri = {-1,2,19,-2,0,4};
foreach (int num in numeri)
Console.WriteLine("Il numero {0} è {1}; ", num, d(num));
}
}
La riga
public delegate String metodoDelegate(int numero); dichiara il delegate, la classe
classeDelegate contiene i metodi richiamabili
Nel Main istanziamo la classe ed il metodo Delegate, e poi lo richiamiamo passandogli dei valori diversi.
L'output sara:
Il numero -1 è minore di zero;
Il numero 2 è maggiore di zero;
Il numero 19 è maggiore di zero;
Il numero -2 è minore di zero;
Il numero 0 è uguale a zero;
Il numero 4 è maggiore di zero;
Eventi
Gli eventi sono simili alle chiamate di metodo, ma a differenza di questi ultimi, la loro invocazione deve essere generata esternamente.
Un esempio classico è la pressione di un pulsante in una interfaccia grafica o una pagina web.
Gli eventi sono realizzati tramite un tipo particolare di Delegate, detti "multicast".
Si deve creare un delegate e poi "sottoscrivere" l'evento tramite la sintassi:
classe.Evento += new GestoreEvento.EventDelegate(funzione);
Vediamo un esempio pratico:
using System;
delegate void testEventHandler(object source, string messaggio);
class test
{
public event testEventHandler testEvento;
public void Evento(string messaggio)
{
Console.WriteLine("Evento!");
if (testEvento != null)
{
testEvento(this, messaggio);
}
}
}
public class EventSample
{
public EventSample() {}
static void Main()
{
test b = new test();
b.testEvento += new testEventHandler(onTestAction);
b.Evento("ciao, sono un evento!");
}
public static void onTestAction(object source, string messaggio)
{
Console.WriteLine("Siamo all'interno del gestore di eventi.");
Console.WriteLine("Messaggio: " + messaggio);
}
}
Il Main istanzia una classe "test" che contiene un gestore di eventi,
viene poi sottoscritto il metodo che risponde agli eventi ed infine scatenato l'evento
Ecco l'output:
Evento!
Siamo all'interno del gestore di eventi.
Messaggio: ciao, sono un evento!