Nell’ultimo post mi sono occupato di ereditarietà, interfacce, partial class e generics. Per completare gli strumenti che ci aiutano nella costruzione delle nostre classi, vediamo ora Attribute, Event e Type Forwarding:
Attribute: un attributo consente di contraddistinguere (taggare) un metodo, una proprietà, un tipo con informazioni che possono essere lette ed utilizzate programmaticamente. Ad esempio il runtime leggendo questi attributi può: conoscere quali privilegi sono richiesti da una classe, quali capacità ha la classe, descrivere l’autore, ecc.
Tutti i tipi di attributi derivano dalla classe System.Attribute e la sintassi prevede che siano inseriti all’interno delle parentesi quadre.
Esempio:
[assembly: AssemblyCompany("Microsoft Learning")] [assembly: AssemblyProduct("ch01cs")] [assembly: AssemblyCopyright("Copyright © 2006")] [assembly: AssemblyTrademark("")][assembly:FileIOPermissionAttribute(SecurityAction.RequestMinimum, Read=@"C:\boot.ini")]
Event : il concetto di evento non è certamente nuovo per chi, come me, ha iniziato a programmare su Windows 3.1. Ho ancora da qualche parte i due libri di Charles Petzold, quanti ricordi
Un evento è un segnale che avvisa che una certa azione è accaduta.
L’evento viene inviato da una classe (event sender) che non conosce chi sarà la classe che gestirà l’evento (event receiver). Vi è invece un meccanismo posto tra i due che veicola gli eventi dal sender al receiver. Tale meccanismo in .NET è costituito dai delegate.
Piccola parentesi:
Cos’è un delegate? Un delegate è una classe che mantiene un puntatore ad un metodo con una specifica signature.
La dichiarazione del metodo delegate è sufficiente a specificare la classe delegate.
I delegate sono usati in molti ambiti tra cui la gestione degli eventi.
La signature standard di un delegate che gestisce gli eventi, è un metodo che:
1) non ritorna valori,
2) ha come primo parametro un’istanza di tipo object, che rappresenta l’event sender
3) ha come secondo parametro un’istanza di un tipo derivato da EventArgs che contiene dettagli specifici del tipo di evento. A seconda dell’evento infatti diversi sono i dettagli e diverse sono le classi usate tutte derivate da EventArgs.
Il delegate EventHandler è predefinito e può essere usato per quando il metodo che risponde ad un evento non genera dati. Se invece l’evento genera dati allora bisogna creare un nuovo delegate che abbia come secondo parametro un proprio tipo custom, o usare la versione generica del delegate EventHandler usando il tipo corretto.
Per associare un evento al metodo di gestione, è sufficiente aggiungere un’istanza del delegate all’evento.
Esempio:
1) Creiamo il metodo di gestione dell’evento in modo che segua la signature del delegate EventHandler
private void button1_Click(object sender, EventArgs e) { // Method code }
2) Aggiungiamo il metodo all’evento “Click” di un ipotetico “button1”
this.button1.Click += new System.EventHandler(this.button1_Click);
Type Forwarding
Type forwarding consente di “muovere” un tipo da un assembly A in un altro assembly B facendolo a runtime, cioè senza modificare nessuna riga del codice sorgente.
Lo si fa per esempio con le seguenti righe di codice:
using System.Runtime.CompilerServices; [assembly:TypeForwardedTo(typeof(DestLib.TypeA))]
Ma quando la userò mai questa feature?
Seguendo la tabella di marcia, il prossimo post cercherà di riassumere il capitolo “Conversione dei tipi”.