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

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>