Introduzione ai delegatiIntroduction to Delegates

I delegati offrono un meccanismo di associazione tardiva in .NET.Delegates provide a late binding mechanism in .NET. L'associazione tardiva indica la creazione di un algoritmo in cui il chiamante specifica almeno un metodo che implementa parte dell'algoritmo.Late Binding means that you create an algorithm where the caller also supplies at least one method that implements part of the algorithm.

Ad esempio, si consideri l'ordinamento di un elenco di stelle in un'applicazione di astronomia.For example, consider sorting a list of stars in an astronomy application. È possibile scegliere di ordinare le stelle in base alla distanza da terra, alla grandezza o alla luminosità percepita.You may choose to sort those stars by their distance from the earth, or the magnitude of the star, or their perceived brightness.

In tutti i casi, il metodo Sort() esegue essenzialmente la stessa operazione, ovvero ordina gli elementi nell'elenco in base a un confronto.In all those cases, the Sort() method does essentially the same thing: arranges the items in the list based on some comparison. Il codice che esegue il confronto di due stelle è diverso per ognuno degli ordinamenti.The code that compares two stars is different for each of the sort orderings.

Questi tipi di soluzioni sono stati usati nel software per mezzo secolo.These kinds of solutions have been used in software for half a century. Il concetto di delegato del linguaggio C# offre un supporto del linguaggio di prima classe e indipendenza dai tipi.The C# language delegate concept provides first class language support, and type safety around the concept.

Come si vedrà più avanti in questa serie, il codice C# scritto per algoritmi come questo è indipendente dai tipi e usa le regole del linguaggio e il compilatore per assicurarsi che i tipi corrispondano per gli argomenti e i tipi restituiti.As you'll see later in this series, the C# code you write for algorithms like this is type safe, and uses the language rules and the compiler to ensure that the types match for arguments and return types.

I puntatori a funzione sono stati aggiunti a C# 9 per scenari simili, in cui è necessario un maggiore controllo sulla convenzione di chiamata.Function pointers were added to C# 9 for similar scenarios, where you need more control over the calling convention. Il codice associato a un delegato viene richiamato usando un metodo virtuale aggiunto a un tipo delegato.The code associated with a delegate is invoked using a virtual method added to a delegate type. Usando i puntatori a funzione, è possibile specificare convenzioni diverse.Using function pointers, you can specify different conventions.

Obiettivi della progettazione del linguaggio per i delegatiLanguage Design Goals for Delegates

I designer del linguaggio hanno enumerato diversi obiettivi per la funzionalità che in seguito è diventata la funzionalità dei delegati.The language designers enumerated several goals for the feature that eventually became delegates.

Il team voleva un costrutto di linguaggio comune che potesse essere usato per i successivi algoritmi di associazione tardiva.The team wanted a common language construct that could be used for any late binding algorithms. I delegati consentono agli sviluppatori di apprendere un concetto e utilizzare lo stesso concetto in molti problemi software diversi.Delegates enable developers to learn one concept, and use that same concept across many different software problems.

In secondo luogo, il team voleva supportare le chiamate al metodo sia singole che multicast.Second, the team wanted to support both single and multicast method calls. I delegati multicast sono i delegati che concatenano più chiamate al metodo.(Multicast delegates are delegates that chain together multiple method calls. Alcuni esempi sono disponibili più avanti in questa serie.You'll see examples later in this series.)

Il team voleva che i delegati supportassero la stessa indipendenza dai tipi stesso che gli sviluppatori si aspettano da tutti i costrutti C#.The team wanted delegates to support the same type safety that developers expect from all C# constructs.

Infine, il team ha riconosciuto uno schema di eventi è un modello specifico in cui i delegati o qualsiasi algoritmo di associazione tardivo è molto utile.Finally, the team recognized an event pattern is one specific pattern where delegates, or any late binding algorithm, is very useful. Il team voleva garantire che il codice per i delegati potesse fornire la base per il modello di eventi .NET.The team wanted to ensure the code for delegates could provide the basis for the .NET event pattern.

Il risultato di tutto il lavoro sono stati il delegato e il supporto degli eventi di C# e .NET.The result of all that work was the delegate and event support in C# and .NET. Negli articoli rimanenti di questa sezione vengono illustrate le funzionalità del linguaggio, il supporto della libreria e gli idiomi comuni usati quando si lavora con i delegati.The remaining articles in this section will cover language features, library support, and common idioms used when you work with delegates.

Verranno fornite informazioni sulla parola chiave delegate e sul codice generato dalla parola chiave.You'll learn about the delegate keyword and what code it generates. Verranno fornite informazioni sulle funzionalità nella classe System.Delegate e sul loro utilizzo.You'll learn about the features in the System.Delegate class, and how those features are used. Si apprenderà come creare delegati indipendenti dai tipi e come creare metodi che possono essere richiamati tramite i delegati.You'll learn how to create type safe delegates, and how to create methods that can be invoked through delegates. Si apprenderà anche come usare i delegati e gli eventi tramite le espressioni lambda.You'll also learn how to work with delegates and events by using Lambda expressions. Sarà possibile osservare il punto nel quale i delegati diventano uno dei blocchi predefiniti per LINQ.You'll see where delegates become one of the building blocks for LINQ. Si apprenderà come i delegati sono la base per il modello di eventi .NET e come sono diversi.You'll learn how delegates are the basis for the .NET event pattern, and how they're different.

A questo punto, procedere con l'esercitazione.Let's get started.

AvantiNext