Diese Dokumentation wurde archiviert und wird nicht länger gepflegt.

Anonyme Methoden (C#-Programmierhandbuch)

Vor Version 2.0 bestand die einzige Möglichkeit zum Deklarieren eines Delegaten in C# darin, benannte Methoden zu verwenden. C# 2.0 führt anonyme Methoden ein.

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

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

oder

// Create a delegate instance
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 separaten Methoden mehr erstellt werden müssen.

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();
}

Der Gültigkeitsbereich der Parameter einer anonymen Methode ist der anonymous-method-block.

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

Die lokalen Variablen und Parameter, in deren Gültigkeitsbereich eine anonyme Methodendeklaration enthalten ist, werden als äußere oder erfasste 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 einer äußeren Variablen bis zu dem Punkt, an dem die Delegaten, die auf die anonyme Methode verweisen, 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 von anonymous-method-block nicht zugegriffen werden.

Im folgenden Beispiel werden die 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);
    }
}

The delegate using the anonymous method is called.

The delegate using the named method is called.

Anzeigen: