delegate-Operator
Der delegate
-Operator erstellt eine anonyme Methode, die in einen Delegattyp konvertiert werden kann. Eine anonyme Methode kann in Typen wie System.Action und System.Func<TResult> konvertiert werden, die als Argumente für viele Methoden verwendet werden.
Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4)); // output: 7
Hinweis
Lambdaausdrücke bieten eine kürzere und aussagekräftigere Möglichkeit zum Erstellen anonymer Funktionen. Verwenden Sie den =>-Operator, um einen Lambdaausdruck zu erstellen:
Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4)); // output: 7
Weitere Informationen zu Features von Lambdaausdrücken (etwa zum Erfassen äußerer Variablen) finden Sie unter Lambdaausdrücke.
Bei Verwendung des Operators delegate
können Sie die Parameterliste weglassen. Die erstellte anonyme Methode kann dann mit einer beliebigen Parameterliste in einen Delegattyp konvertiert werden, wie im folgenden Beispiel zu sehen:
Action greet = delegate { Console.WriteLine("Hello!"); };
greet();
Action<int, double> introduce = delegate { Console.WriteLine("This is world!"); };
introduce(42, 2.7);
// Output:
// Hello!
// This is world!
Dies ist die einzige Funktion anonymer Methoden, die von Lambdaausdrücken nicht unterstützt wird. In allen anderen Fällen ist ein Lambdaausdruck eine bevorzugte Methode zum Schreiben von Inlinecode. Sie können zwar discards verwenden, um mindestens zwei Eingabeparameter einer anonymen Methode anzugeben, die nicht von der Methode verwendet werden:
Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4)); // output: 42
Aus Gründen der Abwärtskompatibilität wird _
als Name dieses Parameters innerhalb einer anonymen Methode behandelt, wenn nur ein einzelner Parameter den Namen _
aufweist.
Sie können den static
-Modifizierer bei der Deklaration einer anonymen Methode verwenden:
Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4)); // output: 14
Eine statische anonyme Methode kann keine lokalen Variablen oder den Instanzstatus aus einschließenden Bereichen erfassen.
Zum Deklarieren eines Delegattyps wird auch das Schlüsselwort delegate
verwendet.
Ab C# 11 kann der Compiler das aus einer Methodengruppe erstellte Delegatobjekt zwischenspeichern. Sehen Sie sich die folgende Methode an:
static void StaticFunction() { }
Wenn Sie die Methodengruppe einem Delegaten zuweisen, speichert der Compiler diesen zwischen:
Action a = StaticFunction;
Vor C# 11 müssen Sie einen Lambdaausdruck verwenden, um ein einzelnes Delegatobjekt wiederzuverwenden:
Action a = () => StaticFunction();
C#-Sprachspezifikation
Weitere Informationen finden Sie im Abschnitt Anonyme Funktionsausdrücke der C#-Sprachspezifikation.