Introduzione a delegati ed eventi in C#

I delegati offrono un meccanismo di associazione tardiva in .NET. L'associazione tardiva indica la creazione di un algoritmo in cui il chiamante specifica almeno un metodo che implementa parte dell'algoritmo.

Ad esempio, si consideri l'ordinamento di un elenco di stelle in un'applicazione di astronomia. È possibile scegliere di ordinare le stelle in base alla distanza da terra, alla grandezza o alla luminosità percepita.

In tutti i casi, il metodo Sort() esegue essenzialmente la stessa operazione, ovvero ordina gli elementi nell'elenco in base a un confronto. Il codice che esegue il confronto di due stelle è diverso per ognuno degli ordinamenti.

Questi tipi di soluzioni sono stati usati nel software per mezzo secolo. Il concetto di delegato del linguaggio C# offre un supporto del linguaggio di prima classe e indipendenza dai tipi.

Come vedrai più avanti in questa serie, il codice C# scritto per algoritmi come questo è indipendente dai tipi. Il compilatore garantisce che i tipi corrispondano agli argomenti e ai tipi restituiti.

I puntatori a funzione supportano 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, puoi specificare convenzioni diverse.

Obiettivi della progettazione del linguaggio per i delegati

I designer del linguaggio hanno enumerato diversi obiettivi per la funzionalità che in seguito è diventata la funzionalità dei delegati.

Il team voleva un costrutto di linguaggio comune che potesse essere usato per i successivi algoritmi di associazione tardiva. I delegati consentono agli sviluppatori di apprendere un solo concetto e di usare lo stesso concetto in diversi problemi software.

In secondo luogo, il team voleva supportare le chiamate al metodo sia singole che multicast. I delegati multicast sono i delegati che concatenano più chiamate al metodo. Alcuni esempi sono disponibili più avanti in questa serie.

Il team voleva che i delegati supportassero la stessa indipendenza dai tipi stesso che gli sviluppatori si aspettano da tutti i costrutti C#.

Infine il team ha riconosciuto che un modello di evento è un modello specifico, in cui i delegati o qualsiasi algoritmo di associazione tardiva risultano utili. Il team voleva assicurarsi che il codice per i delegati potesse offrire la base per il modello di evento di .NET.

Il risultato di tutto il lavoro sono stati il delegato e il supporto degli eventi di C# e .NET.

Gli articoli rimanenti di questa serie descrivono le funzionalità del linguaggio, il supporto delle librerie e i termini comuni usati per delegati ed eventi. Imparerai:

  • La parola chiave delegate e il codice generato dalla parola chiave.
  • Le funzionalità nella classe System.Delegate e il loro utilizzo.
  • Come creare delegati indipendenti dai tipi.
  • Come creare metodi che possono essere richiamati tramite delegati.
  • Come usare i delegati e gli eventi tramite le espressioni lambda.
  • Il punto nel quale i delegati diventano uno dei blocchi predefiniti per LINQ.
  • Il modo in cui i delegati costituiscono la base per lo schema di eventi .NET e in cosa differiscono.

Iniziamo.

Avanti