C#: Qualcosa sui delegati (delegate)
A cosa serve la parola riservata delegate?
Serve sostanzialmente per dichiarare un puntatore che invece di rappresentare un valore scalare, rappresenta un metodo. Un delegato “delega” al metodo a cui punta l’esecuzione di codice. In sostanza è possibile, dopo aver creato un delegato, registrargli uno o più metodi che verranno eseguiti nel momento in cui verrà eseguito il delegato stesso.
Si dichiara in questo modo:
public delegate void Operazione(int value1, int value2); |
Operazione è un puntatore ad un metodo, che prende in ingresso due interi e non restituisce niente.
Tutti i metodi che prendono in ingresso due numeri e non restituiscono niente possono essere puntati da questo delegate. Ad esempio:
public class Operazioni { public void Somma(int a, int b) { Console.Writeline("Somma: {0}", a+b); } public void Differenza(int a, int b) { Console.Writeline("Differenza: {0}", a - b); } public void Moltiplicazione(int a, int b) { Console.Writeline("Moltiplicazione: {0}", a * b); } public void Moltiplicazione(int a, int b) { Console.Writeline("Divisione: {0}", a / b); } } |
E’ possibile instanziare Operazione in questo modo:
Operazione op = new Operazione(Operazioni.Somma); |
A questo punto la trasformazione è completa, e op
è a tutti gli effetti il metodo Somma
della classe Operazioni
. L’istruzione:
op(2,3); |
Genera l’output;
Somma: 5
In realtà è possibile assegnare più funzioni allo stesso delegato, che diventa un delegato composto, attraverso l’operatore “+”. Si parla di delegati multicast:
Operazione op = new Operazione(Somma); op += Differenza; op += Moltiplicazione; op += Divisione; op(3,3); |
Chiamando il delegato vengono chiamati tutti i metodi “registrati” a lui stesso. In questo caso il risultato è:
Somma: 6
Differenza: 0
Moltiplicazione: 9
Divisione: 1
Per questo comportamento i delegati sono alla base dei metodi di callback, e più in generale della gestione degli eventi.
Leave a Reply