Delegati (Guida per programmatori C#)
Un delegato è un tipo che definisce una firma del metodo. Quando si crea un'istanza di un delegato, è possibile associare l'istanza a qualsiasi metodo con una firma compatibile. Tramite l'istanza di delegato è possibile invocare (o chiamare) il metodo.
I delegati vengono utilizzati per passare metodi come argomenti ad altri metodi. I gestori di evento non sono altro che metodi richiamati tramite delegati. Creare un metodo personalizzato e una classe, ad esempio un controllo Windows, può chiamare tale metodo quando si verifica un evento determinato. Nell'esempio che segue viene illustrata la dichiarazione di un delegato:
public delegate int PerformCalculation(int x, int y);
È possibile assegnare al delegato qualsiasi metodo da tutte le classi o le strutture accessibili corrispondenti alla firma del delegato, costituita dal tipo e dai parametri restituiti. Il metodo può essere un metodo statico o di istanza. In questo modo è possibile modificare a livello di codice le chiamate ai metodi, nonché inserire nuovo codice nelle classi esistenti. Se si conosce la firma del delegato, è possibile assegnare un metodo personalizzato.
Nota
Nel contesto di overload dei metodi, la firma di un metodo non include il valore restituito, mentre nel contesto dei delegati, la firma include il valore restituito. In altre parole, un metodo deve restituire lo stesso valore del delegato.
La possibilità di fare riferimento a un metodo come parametro rende i delegati ideali per la definizione di metodi di callback. È ad esempio possibile passare un riferimento ad un metodo per il confronto di due oggetti come argomento ad un algoritmo di ordinamento. Poiché il codice di confronto è in una routine separata, l'algoritmo di ordinamento può essere scritto in modo più generale.
Cenni preliminari sui delegati
Di seguito sono riportate le caratteristiche principali dei delegati:
Sono simili ai puntatori a funzioni del linguaggio C++, ma sono indipendenti dai tipi.
Consentono di passare metodi come parametri.
Possono essere utilizzati per definire metodi di callback.
Possono essere concatenati, ad esempio per chiamare più metodi su un unico evento.
Non devono corrispondere necessariamente alla firma del delegato. Per ulteriori informazioni, vedere Utilizzo della varianza nei delegati (C# e Visual Basic).
In C# versione 2.0 è stato introdotto il concetto di metodi anonimi, che consentono di passare blocchi di codice come parametri anziché un metodo definito a parte. In C# 3.0 sono state introdotte le espressioni lambda per scrivere in modo più conciso i blocchi di codice in linea. I metodi anonimi e le espressioni lambda vengono, in determinati contesti, compilati in tipi delegati. Queste funzionalità sono ora note come funzioni anonime. Per ulteriori informazioni sulle espressioni lambda, vedere Funzioni anonime (Guida per programmatori C#).
Argomenti della sezione
Quando utilizzare i delegati anziché le interfacce (Guida per programmatori C#)
Delegati con metodi denominati e anonimi (Guida per programmatori C#)
Procedura: combinare delegati multicast (Guida per programmatori C#)
Procedura: dichiarare un delegato, crearne un'istanza e utilizzarlo (Guida per programmatori C#)
Specifiche del linguaggio C#
Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.
Capitoli del libro rappresentati
Delegates, Events, and Lambda Expressions in C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers
Delegates and Events in Learning C# 3.0: Master the fundamentals of C# 3.0
Vedere anche
Riferimenti
Eventi (Guida per programmatori C#)