L'uso dei delegates con ASP.NET

di Andrea Zani, in ASP.NET,

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
3 pagine in totale: 1 2 3

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti