Funzioni anonime (Guida per programmatori C#)
Aggiornamento: novembre 2007
Come descritto in un altro punto, un delegato è un tipo che esegue il wrapping di una chiamata al metodo. Un'istanza di delegato può essere passata tra metodi in modo analogo a un tipo e può essere richiamata come un metodo. Una funzione anonima è un'istruzione o espressione "in linea" che può essere utilizzata con un tipo delegato. È possibile utilizzarla per inizializzare un delegato denominato o passarla come parametro del metodo invece di un tipo delegato denominato.
Sono disponibili due tipi di funzioni anonime, illustrati singolarmente negli argomenti seguenti:
Metodi anonimi (Guida per programmatori C#)
Nota:
Le espressioni lambda possono essere associate alle strutture ad albero dell'espressione nonché ai delegati.
L'evoluzione dei delegati in C#
In C# 1.0 l'istanza di un delegato viene creata inizializzandola in modo esplicito con un metodo definito in un altro punto del codice. In C# 2.0 viene introdotto il concetto dei metodi anonimi per scrivere blocchi di istruzioni in linea senza nome che possono essere eseguiti in una chiamata del delegato. In C# 3.0 vengono introdotte le espressioni lambda, che sono analoghe ai metodi anonimi ma più esplicite e concise. Queste due funzionalità sono conosciute collettivamente come funzioni anonime. In generale, le applicazioni che sono destinate alla versione 3.5 e alle versioni successive di .NET Framework devono utilizzare le espressioni lambda.
Nell'esempio seguente viene illustrata l'evoluzione della creazione del delegato da C# 1.0 a C# 3.0:
class Test
{
delegate void TestDelegate(string s);
static void M(string s)
{
Console.WriteLine(s);
}
static void Main(string[] args)
{
// Original delegate syntax required
// initialization with a named method.
TestDelegate testdelA = new TestDelegate(M);
// C# 2.0: A delegate can be initialized with
// inline code, called an "anonymous method." This
// method takes a string as an input parameter.
TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); };
// C# 3.0. A delegate can be initialized with
// a lambda expression. The lambda also takes a string
// as an input parameter (x). The type of x is inferred by the compiler.
TestDelegate testDelC = (x) => { Console.WriteLine(x); };
// Invoke the delegates.
testdelA("Hello. My name is M and I write lines.");
testDelB("That's nothing. I'm anonymous and ");
testDelC("I'm a famous author.");
// Keep console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Hello. My name is M and I write lines.
That's nothing. I'm anonymous and
I'm a famous author.
Press any key to exit.
*/
Specifiche del linguaggio C#
Per ulteriori informazioni, vedere la seguente sezione inclusa in Specifiche del linguaggio C#:
- 5.3.3.29 Funzioni anonime
Vedere anche
Concetti
Strutture ad albero dell'espressione
Riferimenti
Istruzioni, espressioni e operatori (Guida per programmatori C#)