Condividi tramite


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:

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#)

Delegati (Guida per programmatori C#)