Anonyme Methoden (C#-Programmierhandbuch)

In Versionen von C# vor 2.0 bestand die einzige Möglichkeit zum Deklarieren eines Delegaten in der Verwendung von benannten Methoden. Mit C# 2.0 wurden anonyme Methoden eingeführt, und in C# 3.0 und höher lösen Lambdaausdrücke anonyme Methoden als bevorzugten Weg zum Schreiben von Inlinecode ab. Die Informationen zu anonymen Methoden in diesem Thema gelten jedoch auch für Lambdaausdrücke. In einem Fall bietet eine anonyme Methode eine Funktion, über die Lambdaausdrücke nicht verfügen. Anonyme Methoden ermöglichen das Auslassen der Parameterliste. Das bedeutet, dass eine anonyme Methode in Delegaten mit verschiedenen Signaturen konvertiert werden kann. Dies ist bei Lambdaausdrücken nicht möglich. Weitere Informationen zu Lambdaausdrücken finden Sie unter Lambdaausdrücke.

Das Erstellen anonymer Methoden ist im Grunde genommen ein Weg, um einen Codeblock als Delegatparameter zu übergeben. Hier sind 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) { /* ... */ };

Mit anonymen Methoden verringern Sie den Mehraufwand an Codierung beim Instanziieren von Delegaten, da Sie keine separate Methode erstellen müssen.

So kann es nützlich sein, einen Codeblock anstatt eines Delegaten anzugeben, wenn das Erstellen einer Methode mit unnötigem Aufwand verbunden scheint. Ein gutes Beispiel ist das Starten eines neuen Threads. Diese Klasse erstellt einen Thread und enthält zudem den Code, den der Thread ausführt, ohne dass eine zusätzliche Methode für den Delegaten erstellt wird.

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

Hinweise

Der Bereich der Parameter einer anonymen Methode ist der anonyme Methodenblock.

Es ist ein Fehler, wenn sich eine Sprunganweisung wie goto, break oder continue innerhalb des anonymen Methodenblocks befindet, wenn das Ziel außerhalb des Blocks liegt. Es ist auch ein Fehler, wenn sich eine Sprunganweisung wie goto, break oder continue außerhalb des anonymen Methodenblocks befindet, wenn das Ziel innerhalb des Blocks liegt.

Die lokalen Variablen und Parameter, deren Bereich eine anonyme Methodendeklaration enthält, werden als äußere Variablen der anonymen Methode bezeichnet. Beispielsweise ist im folgenden Codesegment n eine äußere Variable:

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

Ein Verweis auf die äußere Variable n gilt als erfasst, wenn der Delegat erstellt wird. Anders als bei lokalen Variablen erstreckt sich die Lebensdauer einer erfassten Variablen so lange, bis die Delegaten, die auf die anonymen Methoden verweisen, für die automatische Speicherbereinigung verfügbar sind.

Eine anonyme Methode kann nicht auf die Parameter ref oder out eines äußeren Bereichs zugreifen.

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

Anonyme Methoden sind auf der linken Seite des is-Operators nicht zulässig.

Beispiel

Im folgenden Beispiel werden zwei Möglichkeiten veranschaulicht, um einen Delegaten zu instanziieren:

  • Zuordnen des Delegaten zu einer anonymen Methode.

  • 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()
    {
        // Instantiate 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

C#-Referenz
C#-Programmierhandbuch
Delegaten
Lambdaausdrücke
Unsicherer Code und Zeiger
Methoden
Delegate mit benannten im Vergleich zu anonymen Methoden