Delegati (Guida per programmatori C#)

Aggiornamento: novembre 2007

Un delegato è un tipo che definisce una firma di metodo e può essere associato a qualsiasi metodo con una firma compatibile. Tramite il 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. Creando un metodo personalizzato, 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 algoritmo di ordinamento come riferimento al metodo per il confronto di due oggetti. La separazione del codice di confronto consente di scrivere l'algoritmo in modo più generico.

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 la classe Covariance and ContravarianceCovariante e controvariante nei delegati (Guida per programmatori C#).

  • 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#).

In questa sezione

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le sezioni riportate di seguito in Specifiche del linguaggio C#:

  • 1.11 Delegati

  • 4.2.6 Tipi delegati

  • 7.5.5.3 Chiamate di delegati

  • 15 Delegati

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Eventi (Guida per programmatori C#)

Delegate