Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I delegati forniscono un meccanismo di associazione tardiva in .NET. Associazione tardiva significa che si crea un algoritmo in cui il chiamante fornisce almeno un metodo che implementa parte dell'algoritmo.
Si consideri ad esempio l'ordinamento di un elenco di stelle in un'applicazione di astronomia. È possibile scegliere di ordinare le stelle in base alla loro distanza dalla terra, o la grandezza della stella, o la loro luminosità percepita.
In tutti questi casi, il metodo Sort() esegue essenzialmente la stessa operazione: dispone gli elementi nell'elenco in base a un confronto. Il codice che confronta due stelle è diverso per ogni ordinamento.
Questi tipi di soluzioni sono stati usati nel software per mezzo secolo. Il concetto di delegati nel linguaggio C# offre un supporto linguistico di prima classe e garantisce la sicurezza dei tipi intorno a questo concetto.
Come si vedrà più avanti in questa serie, il codice C# scritto per algoritmi come questo è sicuro rispetto ai tipi. Il compilatore garantisce che i tipi corrispondano agli argomenti e ai tipi restituiti.
Puntatori di funzione supportano scenari simili in cui è necessario avere 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.
Obiettivi di progettazione del linguaggio per i delegati
I progettisti della lingua hanno elencato diversi obiettivi della funzionalità che sono infine diventati delegati.
Il team voleva un costrutto di linguaggio comune che poteva essere usato per qualsiasi algoritmo di associazione tardiva. I delegati consentono agli sviluppatori di apprendere un concetto e di usare lo stesso concetto in molti problemi software diversi.
In secondo luogo, il team voleva supportare sia chiamate di metodo single che multicast. I delegati multicast sono delegati che concatenano diverse invocazioni di metodo. Più avanti in questa serie verranno mostrati esempi.
Il team voleva che i delegati supportassero lo stesso tipo di sicurezza che ci si aspetta da tutti i costrutti C#.
Infine, il team ha riconosciuto che un pattern di eventi è quello specifico in cui i delegati, o qualsiasi algoritmo di binding tardivo, sono utili. Il team voleva assicurarsi che il codice per i delegati potesse fornire la base per il modello di eventi .NET.
Il risultato di tutto il lavoro è stato il supporto per delegati e eventi in C# e .NET.
Gli articoli rimanenti di questa serie illustrano le funzionalità del linguaggio, il supporto della libreria e i linguaggi comuni usati quando si lavora con delegati ed eventi. Imparerai:
- Parola
delegate
chiave e codice generato. - Le funzionalità della
System.Delegate
classe e il modo in cui vengono usate tali funzionalità. - Come creare delegati sicuri rispetto al tipo.
- Come creare metodi che possono essere richiamati tramite delegati.
- Come lavorare con delegati ed eventi utilizzando espressioni lambda.
- Come i delegati diventano uno dei mattoni fondamentali per LINQ.
- Il modo in cui i delegati sono la base per il modello di eventi .NET e il modo in cui sono diversi.
Iniziamo.