Anonyme Methoden (C#-Programmierhandbuch)

In C#-Versionen vor 2.0 bestand die einzige Möglichkeit zum Deklarieren eines Delegaten darin, benannte Methoden zu verwenden. In C# 2.0 wurden anonyme Methoden eingeführt, und in C# 3.0 und höher werden diese von Lambda-Ausdrücken als bevorzugtes Verfahren zum Schreiben von Inlinecode ersetzt. Die Informationen zu anonymen Methoden in diesem Thema gelten auch für Lambda-Ausdrücke. Nur in einem Fall werden durch eine anonyme Methode Funktionen bereitgestellt, die in Lambda-Ausdrücken nicht zur Verfügung stehen. Bei anonymen Methoden können Sie auf eine Verwendung der Parameterliste verzichten. Dies bedeutet, dass eine anonyme Methode mit einer Vielzahl von Signaturen in Delegaten konvertiert werden kann. Dies ist bei Lambda-Ausdrücken nicht möglich. Weitere Informationen speziell zu Lambda-Ausdrücken finden Sie unter Lambda-Ausdrücke (C#-Programmierhandbuch).

Anonyme Methoden bieten im Wesentlichen eine Möglichkeit, einen Codeblock als Delegatparameter zu übergeben. Hier zwei Beispiele:

// Create a handler for a click event.
button1.Click += delegate(System.Object o, System.EventArgs e)
                   { System.Windows.Forms.MessageBox.Show("Click!"); };
// Create a delegate.
delegate void Del(int x);

// Instantiate the delegate using an anonymous method.
Del d = delegate(int k) { /* ... */ };

Durch anonyme Methoden wird der Codierungsaufwand des Instanziierens von Delegaten reduziert, weil keine separate Methode erstellt werden muss.

Beispielsweise kann die Angabe eines Codeblocks anstelle eines Delegaten in einer Situation nützlich sein, in der das Erstellen einer Methode als unnötiger Aufwand erscheinen würde. Ein gutes Beispiel dafür wäre das Starten eines neuen Threads. Diese Klasse erstellt einen Thread und enthält außerdem den Code, den der Thread ausführt, ohne dass eine zusätzliche Methode für den Delegaten erstellt werden muss.

void StartThread()
{
    System.Threading.Thread t1 = new System.Threading.Thread
      (delegate()
            {
                System.Console.Write("Hello, ");
                System.Console.WriteLine("World!");
            });
    t1.Start();
}

Hinweise

Der Gültigkeitsbereich der Parameter einer anonymen Methode ist der anonyme Methodenblock.

Das Vorhandensein einer Sprunganweisung (z. B. goto, break oder continue) innerhalb des anonymen Methodenblocks ist ein Fehler, wenn das Ziel außerhalb des Blocks liegt. Umgekehrt ist das Vorhandensein einer Sprunganweisung (z. B. goto, break oder continue) außerhalb des anonymen Methodenblocks ebenfalls ein Fehler, wenn das Ziel innerhalb des Blocks liegt.

Die lokalen Variablen und Parameter, in deren Gültigkeitsbereich eine anonyme Methodendeklaration enthalten ist, werden als äußere Variablen der anonymen Methode bezeichnet. Zum Beispiel ist n im folgenden Codesegment eine äußere Variable:

int n = 0;
Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };

Anders als bei lokalen Variablen erstreckt sich die Lebensdauer der erfassten Variablen bis zu dem Punkt, an dem die auf anonyme Methoden verweisenden Delegaten für die Garbage Collection freigegeben werden. Ein Verweis auf n wird zu dem Zeitpunkt erfasst, an dem der Delegat erstellt wird.

Eine anonyme Methode kann nicht auf den ref-Parameter oder den out-Parameter eines äußeren Gültigkeitsbereichs zugreifen.

Auf unsicheren Code kann innerhalb des anonymen Methodenblocks nicht zugegriffen werden.

Anonyme Methoden sind auf der linken Seite des Operators is nicht zugelassen.

Beispiel

Im folgenden Beispiel werden zwei Arten veranschaulicht, einen Delegaten zu instanziieren:

  • Das Zuordnen des Delegaten zu einer anonymen Methode.

  • Das Zuordnen des Delegaten zu einer benannten Methode (DoWork).

In beiden Fällen wird eine Meldung angezeigt, wenn der Delegat aufgerufen wird.

// Declare a delegate.
delegate void Printer(string s);

class TestClass
{
    static void Main()
    {
        // Instatiate the delegate type using an anonymous method.
        Printer p = delegate(string j)
        {
            System.Console.WriteLine(j);
        };

        // Results from the anonymous delegate call.
        p("The delegate using the anonymous method is called.");

        // The delegate instantiation using a named method "DoWork".
        p = new Printer(TestClass.DoWork);

        // Results from the old style delegate call.
        p("The delegate using the named method is called.");
    }

    // The method associated with the named delegate.
    static void DoWork(string k)
    {
        System.Console.WriteLine(k);
    }
}
/* Output:
    The delegate using the anonymous method is called.
    The delegate using the named method is called.
*/

Siehe auch

Referenz

Delegaten (C#-Programmierhandbuch)

Lambda-Ausdrücke (C#-Programmierhandbuch)

Unsicherer Code und Zeiger (C#-Programmierhandbuch)

Methoden (C#-Programmierhandbuch)

Delegaten mit benannten im Vergleich zu anonymen Methoden (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch

Weitere Ressourcen

C#-Referenz