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.
Approfondimenti
Implementare il throttling in ASP.NET Core
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Utilizzare la libreria Benchmark.NET per misurare le performance
Load test di ASP.NET Core con k6
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Short-circuiting della Pipeline in ASP.NET Core