Anonyme Funktionen (C#-Programmierhandbuch)

Aktualisiert: November 2007

Wie an anderer Stelle beschrieben, ist ein Delegat ein Typ, der einen Methodenaufruf umschließt. Eine Delegatinstanz kann wie ein Typ zwischen Methoden übergeben werden und wie eine Methode aufgerufen werden. Bei einer anonymen Funktion handelt es sich um eine "Inlineanweisung" bzw. einen Ausdruck, die bzw. der überall dort verwendet werden kann, wo ein Delegattyp erwartet wird. Sie können sie zum Initialisieren eines benannten Delegaten verwenden oder sie anstelle eines benannten Delegattypen als Methodenparameter übergeben.

Es gibt zwei Arten von anonymen Funktionen, die in den folgenden Themen im Einzelnen erläutert werden:

Die Entwicklung von Delegaten in C#

In C# 1.0 wurde eine Instanz eines Delegaten durch explizites Initialisieren mit einer Methode erstellt, die an anderer Stelle im Code definiert war. In C# 2.0 wurde das Konzept anonymer Methoden als Möglichkeit eingeführt, unbenannte Inlineanweisungsblöcke zu schreiben, die in einem Delegataufruf ausgeführt werden können. In C# 3.0 werden Lambda-Ausdrücke eingeführt, die vom Konzept her anonymen Methoden ähneln, jedoch aussagekräftiger und präziser sind. Diese beiden Funktionen werden allgemein als anonyme Funktionen bezeichnet. Im Allgemeinen sollten Anwendungen, die mit Version 3.5 und höher von .NET Framework arbeiten, Lambda-Ausdrücke verwenden.

Im folgenden Beispiel wird die Entwicklung der Delegaterstellung von C# 1.0 bis C# 3.0 veranschaulicht:

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.
 */

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie im folgenden Abschnitt in der C#-Programmiersprachenspezifikation:

  • 5.3.3.29 Anonyme Funktionen

Siehe auch

Konzepte

Ausdrucksbaumstrukturen

Referenz

Anweisungen, Ausdrücke und Operatoren (C#-Programmierhandbuch)

Delegaten (C#-Programmierhandbuch)