Se dovessi spiegare, nel modo più breve possibile, "a che servono i delegate", direi all'incirca: "I delegate permettono di chiamare funzioni referenziate in run-time nel nostro codice...". Probabilmente questa spiegazione non dirà molto a chi è digiuno in materia, ma con un esempio del loro utilizzo in una web application il contetto risulterà più chiaro:
C# namespace Esempio { public Esempio_Delegate string Funzione(string nome); public class Classe2 { public Funzionexfunzione; public void InviaSaluto() { HttpContext.Current.Response.Write(xfunzione("Andrea")); } } public class Delegate : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { Classe2 classe=new Classe2(); classe.xfunzione=new Funzione(this.Saluto); classe.InviaSaluto(); } public string Saluto(string nome) { return "Ciao "+nome; } } }
VB Public Delegate Function Funzione(ByVal nome As String) As String Public Class Classe2 Public xfunzione As Funzione Sub ScriviSaluto() HttpContext.Current.Response.Write(xfunzione("Andrea")) End Sub End Class Public Class Esempio_Delegate Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim classe As New Classe2 classe.xfunzione = New Funzione(AddressOf Me.Saluto) classe.ScriviSaluto() End Sub Public Function Saluto(ByVal nome As String) As String Return "Ciao " + nome End Function End Class
In entrambi i linguaggi, viene definito il delegate al di fuori delle classi in modo che esso abbia visibilità globale:
public delegate string Funzione(string nome);
Esso deve avere la stessa signature della funzione che vogliamo possa essere referenziata, nel nostro esempio Saluto, posta all'interno della classe principale della pagina:
public string Saluto(string nome) { return "Ciao "+nome; }
Per referenziare questa funzione abbiamo utilizzato questo codice:
Classe2 classe=new Classe2(); classe.xfunzione=new Funzione(this.Saluto); classe.InviaSaluto();
Nella prima riga abbiamo istanziato una nuova classe. Nella seconda andiamo ad inserire nel delegate il riferimento alla funzione che vogliamo possa essere richiamata da questa classe. Nella terza e ultima riga di codice andremo a richiamare la funzione "InviaSaluto":
public void InviaSaluto() { HttpContext.Current.Response.Write(xfunzione("Andrea")); }
Quest'ultima richiama per riferimento la funzione "Saluto" passandogli come parametro il nome "Andrea" e restituendo a video "Ciao Andrea".
Nei delegate possiamo naturalmente referenziare anche funzioni statiche. Se "classe2" avesse avuto come membro statico la funzione "InviaSaluto", nel nostro codice sarebbe cambiato poco:
C# public class Classe2 { public Funzione xfunzione; static public void InviaSaluto() { HttpContext.Current.Response.Write(xfunzione("Andrea")); } } ... private void Page_Load(object sender, System.EventArgs e) { Classe2.xfunzione=new Funzione(this.Saluto); Classe2.InviaSaluto(); }
VB Public Class Classe2 Public xfunzione As Funzione Shared Sub ScriviSaluto() HttpContext.Current.Response.Write(xfunzione("Andrea")) End Sub ... Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Classe2.xfunzione = New Funzione(AddressOf Me.Saluto) Classe2.ScriviSaluto() End Sub
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.