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 ClassIn 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 SubAttenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà

Stampa
Download


