Programming Languages Hacks

Importanti regole per linguaggi di programmazione rilevanti come Java, C, C++, C#…

  • Subscribe

  • Lettori

    I miei lettori abituali

  • Twitter

Delegati Anonimi vs Command

Posted by Ricibald on February 18th, 2008

In ASP.NET normalmente i comandi vengono assegnati tramite la creazione di un delegato che risponde all’evento “click” nel seguente modo:

void Page_Load(object sender, EventArgs e) {
    ButtonStudente.Click += new EventHandler(this.Studente_Click);
}
void Studente_Click(object sender, EventArgs e) {
    LabelMatricola.Text = this.Studente.Matricola;
}

Ma nel caso di molteplici pulsanti creati dinamicamente, allora “sarebbe” conveniente utilizzare le proprietà CommandName e CommandArgument, implementazioni “blande” del pattern Command in ASP.NET:

void Page_Load(object sender, EventArgs e) {
    ...
    foreach(Studente s in studenti) {
        Button buttonStudente = new Button();
        buttonStudente.CommandName = "GetMatricola";
        buttonStudente.CommandArgument = s.Matricola;
        buttonStudente.Command += new CommandEventHandler(this.Studente_Click);
    }
    ...
}
void Studente_Click(object sender, CommandEventArgs e)  {
    LabelMatricola.Text = (string)e.CommandArgument;
}

L’approccio è fattibile, ma fragile:

  • parametri passati come oggetto generico da convertire
    • se devo passare una lista di parametri?
      • bisognerebbe creare la versione tipizzata della lista di argomenti
  • possibili errori di cast
  • possibili errori nella scansione del tipo di comando da trattare
  • comportamento distribuito tra cicli e metodi con oggetti da convertire

Per situazioni come queste conviene invece utilizzare tutta la potenza dei delegati anonimi come segue:

void Page_Load(object sender, EventArgs e) {
    ...
    foreach(Studente s in studenti) {
        Button buttonStudente = new Button();
        buttonStudente.Click += new EventHandler(delegate(object sender, EventArgs e) {
            LabelMatricola.Text = s.Matricola;
        });
    }
    ...
}

L’approccio diventa elegante e facilmente comprensibile. Notare che la funzione viene solo dichiarata ed eseguita solo se il click avviene.

Leave a Reply

You must be logged in to post a comment.