Multicast Delegate con C#

Nella mia infinita, consapevole ignoranza, ho scoperto l’esistenza dei Multicast Delegate.
In pratica si traduce nella possibilità di sommare o sottrarre l’esecuzione di diversi metodi che siano conformi ad uno stesso delegate.
Questo comporta un’esecuzione in serie, secondo la somma (o la sottrazione) effettuata.
Mi spiego meglio con un esempio (liberamente tratto da questo esempio msdn):

namespace ConsoleApplication1
{

delegate int delegate1(string s);

class Class1
{

public static int Hello(string s)
{

Console.Write(“hello {0} “,s);

return
s.Length;

}

public
static int World(string s)
{

Console
.Write(” world {0} “, s);

return
s.Length;

}
public static int CarriageReturn(string s)
{
Console.WriteLine(” {0} “, s);
return s.Length;

}

public Class1()
{
delegate1 d1, d2, d3, d4;
d1 = Hello;

d2 = World;

d3 = CarriageReturn;

d4 = d1 + d2 + d3;
d4(“!”);
Console.ReadLine();
}
}
}

Questo comporta il seguente output :

hello ! world ! !

Quindi abbiamo eseguito i metodi nella sequenza identificata dalla somma. Come dicevo, si possono eseguire anche operazioni di sottrazione, corrispondenti alla fine ad una eliminazione dalla sequenza di esecuzione.
Quindi avremmo potuto scrivere (al posto della riga in rosso)

d4(“!”);

d4 -= d2;

d4(“!”);

e ottenere :

hello ! world ! !

hello ! !

Questo “sommatoria” si può eseguire come dicevo, solo se i metodi usati come addendi sono conformi ad uno stesso delegate. Lo stesso discorso non vale per un eventuale valore di
ritorno del metodo, che non corrisponde ad una “sommatoria dei valori di ritorno” dei metodi addendi.

In pratica se avessi scritto :

int i1 = d4(“!”);

Console.WriteLine(“Return : {0}”, i1);

d4 -= d2;

int i2 = d4(“!”);

Console.WriteLine(“Return : {0}”, i2);

avrei ottenuto come output :

hello ! world ! !

Return : 1

hello ! !

Return : 1

quindi è chiaro che il risultato è relativo solo all’ultimo metodo eseguito.

Questo si evidenzia ancora maggiormente se lanciamo un ILDASM sull’assembly, dove notiamo che i punti in cui eseguiamo il delegate d4, viene composto dalle chiamate in sequenza dei metodi che in quel momento lo compongono.

Il risultato di una sommatoria anche del valore di ritorno, si potrebbe comunque ottenere, se proprio necessario in uno scenario del genere, ricorrendo semplicemente (ad esempio) a delle variabili statiche con visibilità globale per la classe.

Multicast Delegate con C#

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...