Delegati e operatore AddressOf
Aggiornamento: novembre 2007
I delegati sono oggetti che possono essere utilizzati per richiamare i metodi di altri oggetti. Talvolta sono anche descritti come puntatori a funzione indipendenti dai tipi in quanto sono analoghi ai puntatori a funzione utilizzati in altri linguaggi di programmazione. Tuttavia, diversamente dai puntatori a funzione, i delegati Visual Basic rappresentano un tipo di riferimento basato sulla classe System.Delegate. I delegati possono fare riferimento sia ai metodi condivisi, ovvero metodi che possono essere chiamati senza un'istanza specifica di una classe, che ai metodi di istanza.
Delegati ed eventi
I delegati risultano utili laddove è necessario un intermediario tra una routine chiamante e la routine che viene richiamata. Si supponga, ad esempio, di desiderare che un oggetto che genera eventi sia in grado di richiamare diversi gestori di eventi in diverse circostanze. Purtroppo, l'oggetto che genera gli eventi non può prevedere quale gestore eventi gestirà uno specifico evento. Visual Basic consente di associare in modo dinamico i gestori eventi agli eventi mediante la creazione di un delegato quando viene utilizzata l'istruzione AddHandler. In fase di esecuzione, il delegato inoltrerà le chiamate al gestore di eventi appropriato.
Sebbene sia possibile creare manualmente i delegati, nella maggior parte dei casi Visual Basic crea automaticamente il delegato con tutti i dettagli necessari. Un'istruzione Event ad esempio consente di definire implicitamente una classe delegata denominata <EventName>EventHandler come classe nidificata della classe contenente l'istruzione Event e con la stessa firma dell'evento. L'istruzione AddressOf consente di creare implicitamente un'istanza di un delegato. Le due righe di codice di seguito indicate, ad esempio, sono equivalenti:
AddHandler Button1.Click, AddressOf Me.Button1_Click
' The previous line of code is shorthand for the next line of code.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
È possibile utilizzare il metodo abbreviato per creare delegati ogni volta che il compilatore è in grado di determinare il tipo del delegato in base al contesto.
Dichiarazione di eventi che utilizzano un tipo delegato esistente
In alcune situazioni, è possibile dichiarare un evento che utilizzi un tipo delegato esistente come proprio delegato sottostante. Di seguito è fornito un esempio al riguardo:
Delegate Sub DelegateType()
Event AnEvent As DelegateType
Questa operazione si rivela utile quando si desidera instradare più eventi sullo stesso gestore.
Parametri e variabili dei delegati
È possibile utilizzare i delegati per altre attività non relative a eventi, quali i modelli di threading Free, o con routine che richiedono la chiamata di diverse versioni delle funzioni in fase di compilazione.
Ad esempio, si supponga di avere un'applicazione di annunci pubblicitari che include una casella di riepilogo contenente nomi di automobili. Gli annunci sono ordinati per titolo, che generalmente corrisponde al modello dell'auto. Si potrebbe verificare un problema qualora il modello di alcune auto fosse preceduto dall'anno di produzione. Il problema consiste nel fatto che la funzionalità di ordinamento integrata della casella di riepilogo effettua l'ordinamento solo in base ai codici dei caratteri, posizionando prima tutti gli annunci che iniziano con una data, quindi tutti quelli che iniziano con il modello.
Per risolvere questo problema, è possibile creare una routine di ordinamento in una classe che utilizzi l'ordinamento alfabetico standard per la maggior parte delle caselle di riepilogo, ma che sia in grado di passare, in fase di esecuzione, alla routine di ordinamento personalizzata per gli annunci relativi alle automobili. A questo scopo, è necessario passare la routine di ordinamento personalizzata alla classe di ordinamento in fase di esecuzione, utilizzando i delegati.
Ogni classe delegata definisce un costruttore al quale viene passata la specifica di un metodo di oggetto. Un argomento di un costruttore di delegato deve essere un riferimento a un metodo o a un'espressione lambda.
Per specificare un riferimento a un metodo, utilizzare la seguente sintassi:
AddressOf [expression.]methodName
In fase di compilazione per il tipo di expression è necessario specificare il nome di una classe o di un'interfaccia contenente un metodo con il nome specificato e con firma corrispondente a quella della classe delegata. methodName può essere un metodo condiviso o di istanza ma non è facoltativo, anche se si crea un delegato per il metodo predefinito della classe.
Per specificare un'espressione lambda, utilizzare la seguente sintassi:
Function ([parm As type, parm2 As type2, ...]) expression
La firma della funzione deve corrispondere a quella del tipo delegato. Per ulteriori informazioni sulle espressioni lambda, vedere Espressioni lambda.
Vedere anche
Attività
Procedura: passare una routine a un'altra routine in Visual Basic
Procedura: richiamare un metodo delegato
Procedura: scrivere gestori eventi