In questa lezione del corso sul linguaggio C#, prenderemo in considerazione un argomento molto complicato, a mio modo di vedere, che consente alle applicazioni di gestire gli eventi, si tratta dei delegati. In applicazioni visuali, tramite il Visual Studio è semplice gestire gli eventi, perché è tutto automatico, ma per meglio capire il funzionamento proviamo a spiegare nel più semplice modo possibile i delegati e gli eventi. I delegati esistono indipendentemente dagli eventi ( pressione di un tasto, scelta di un valore da una lista, ecc.. ecc..) e sebbene i due concetti siano strettamente legati, è possibile utilizzare i delegati semplicemente per disaccoppiare il codice applicativo, demandando funzionalità specifiche all’esterno di una determinata classe. Si può pensare ai delegati come ad una versione più fine delle interfacce, infatti è possibile implementare anche solo un metodo alla volta e sono dei veri e propri oggetti che incapsulano uno specifico metodo finalizzato a rispondere ad una funzione specifica e circoscritta.
I delegati sono dichiarati tramite la parola chiave delegate e come dice la parola stessa vengono delegati per altri metodi, che possono appartenere a più classi, sono simili ai puntatori a funzione del C++, anche se indipendenti dai tipi e sono protetti. Vediamo questo esempio nel quale una funzione viene delegata:
using System; namespace BaseApp { public delegate double Delegato(double dVal); class Program { static void Main(string[] args) { Program pr = new Program(); Delegato q = new Delegato(pr.Quadrato); double dVal = 2.5; dVal = q(dVal); Console.WriteLine("Il valore è {0}", dVal); Console.ReadKey(); } public double Quadrato(double dVal) { return dVal * dVal; } } }
come si vede da questo semplice esempio, il metodo Quadrato della classe Program viene delegato con il nome Delegato. Una peculiarità dei delegati è che possono essere sommati o sotratti, vediamone un esempio:
using System; namespace BaseApp { public delegate double Delegato(double dVal); class Program { static void Main(string[] args) { Program pr = new Program(); Delegato q = new Delegato(pr.Quadrato); q += new Delegato(pr.Cubo); double dVal = 2.5; dVal = q(dVal); Console.WriteLine("\n\nDelego il Quadrato \ ed il Cubo con una somma"); Console.ReadKey(); } public double Quadrato(double dVal) { Console.WriteLine("Il valore del \ prodotto tra {0} e {0} è {1}", dVal, dVal * dVal); return dVal * dVal; } public double Cubo(double dVal) { Console.WriteLine("Il valore del prodotto tra \ {0} e {0} e {0} è {1}", dVal, dVal * dVal * dVal); return dVal * dVal * dVal; } } }
come si può vedere ho sommato due delegati di funzioni, che ricordo devono avere stessa struttura come le interfacce ( stesso tipo di valore di ritorno e stesso tipo di argomenti ). Spero che con questi due esempi abbiate potuto capire i delegati, ho cercato di semplificare al massimo queste nozioni.
L’evento tipo a cui siamo abituati pensare è, per esempio, la pressione di un pulsante nell’interfaccia utente, qui un evento viene generato dal sottosistema a finestre che invia una notifica al gestore ( handler ) relativo. In generale si può pensare ad un evento come ad un cambio dello stato interno di un oggetto, vediamo come implementarlo:
public class GeneraEventi { public delegate void Delegato(object from, ArgomentiEvento args); public event Delegato mioEvento; public void GeneraEvento(ArgomentiEvento args) { mioEvento(this, args); } }
una classe che intenda gestire gli eventi della classe GeneraEventi può sottoscrivere il proprio metodo di gestione con il seguente codice:
GeneraEventi gi; .... gi += new GeneraEventi.Delegato( GestoreEventi );
In pratica la parola chiave event consente di applicare solo somme e sottrazioni ai delegati ( delegati multicast ) e mai uguaglianze, questo ovviamente per evitare di cancellare con una chiamata tutti i gestori eventi definiti prima. Se aveste dei dubbi o incertezze potete usufruire del forum sulla programmazione in C#. Nella prossima lezione vedremo di concludere l’esempio sulle WinForms con l’inserimento dei delegati ed eventi per gestire la scelta di un valore dall’elenco a discesa.
<< Lezione Precedente – Inizio Corso – Indice Lezioni – Lezione Successiva >>
Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…
MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→
In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…
In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…
Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…
Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→