Delegati (Guida per programmatori C#)
Un delegate è un tipo che rappresenta riferimenti ai metodi con un elenco di parametri e un tipo restituito particolari. Quando si crea un'istanza di un delegato, è possibile associare l'istanza a qualsiasi metodo con una firma compatibile e un tipo restituito. Tramite l'istanza di delegato è possibile richiamare (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, che può chiamare tale metodo quando si verifica un determinato evento. Nell'esempio che segue viene illustrata la dichiarazione di un delegato:
public delegate int PerformCalculation(int x, int y);
Qualsiasi metodo di qualsiasi classe o struct accessibile che corrisponde al tipo di delegato può essere assegnato al delegato. Il metodo può essere un metodo statico o di istanza. Questa flessibilità significa che è possibile modificare a livello di codice le chiamate al metodo o inserire nuovo codice in classi esistenti.
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 tipo del delegato.
La possibilità di fare riferimento a un metodo come parametro rende i delegati ideali per la definizione di metodi di callback. È possibile scrivere un metodo che confronta due oggetti nell'applicazione. Tale metodo può essere usato in un delegato per un algoritmo di ordinamento. Poiché il codice di confronto è separato dalla libreria, il metodo di ordinamento può essere più generale.
I puntatori a funzione sono stati aggiunti a C# 9 per scenari simili, in cui è necessario un maggiore controllo sulla convenzione di chiamata. Il codice associato a un delegato viene richiamato usando un metodo virtuale aggiunto a un tipo delegato. Usando i puntatori a funzione, è possibile specificare convenzioni diverse.
Panoramica dei delegati
Di seguito sono riportate le proprietà dei delegati:
- I delegati sono simili ai puntatori a funzione del linguaggio C++, ma sono interamente orientati agli oggetti e, a differenza dei puntatori C++ a funzioni membro, incapsulano sia un'istanza che un metodo dell'oggetto.
- 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 singolo evento.
- I metodi non devono corrispondere esattamente al tipo delegato. Per altre informazioni, vedere Uso della varianza nei delegati.
- Le espressioni lambda sono un modo più conciso di scrivere blocchi di codice inline. Le espressioni lambda (in determinati contesti) vengono compilate per i tipi delegati. Per altre informazioni sulle espressioni lambda, vedere Espressioni lambda.
Contenuto della sezione
- Utilizzo di delegati
- Quando usare i delegati anziché le interfacce (Guida per programmatori C#)
- Delegati con metodi denominati Metodi anonimi
- Uso della varianza nei delegati
- Come combinare delegati (delegati multicast)
- Come dichiarare un delegato, crearne un'istanza e usarlo
Specifiche del linguaggio C#
Per altre informazioni, vedere Delegati nella Specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.
Capitoli del libro rappresentati
- Delegates, Events, and Lambda Expressions (Delegati, eventi ed espressioni lambda) in C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers
- Delegati ed eventi in Learning C# 3.0: Concetti fondamentali di C# 3.0