operator delegat (odwołanie w C#)

Operator delegate tworzy anonimową metodę, która może zostać przekonwertowana na typ delegata:

Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4));  // output: 7

Uwaga

Począwszy od języka C# 3, wyrażenia lambda zapewniają bardziej zwięzły i ekspresyjny sposób tworzenia funkcji anonimowej. Użyj operatora =>, aby utworzyć wyrażenie lambda:

Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4));  // output: 7

Aby uzyskać więcej informacji o funkcjach wyrażeń lambda, na przykład przechwytywaniu zmiennych zewnętrznych, zobacz Wyrażenia lambda.

Jeśli używasz delegate operatora , możesz pominąć listę parametrów. Jeśli to zrobisz, utworzoną metodę anonimową można przekonwertować na typ delegata z dowolną listą parametrów, jak pokazano w poniższym przykładzie:

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!

Jest to jedyna funkcja metod anonimowych, która nie jest obsługiwana przez wyrażenia lambda. We wszystkich innych przypadkach wyrażenie lambda jest preferowanym sposobem pisania kodu wbudowanego.

Począwszy od języka C# 9.0, można użyć odrzuceń, aby określić co najmniej dwa parametry wejściowe metody anonimowej, które nie są używane przez metodę :

Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4));  // output: 42

W celu zapewnienia zgodności z poprzednimi wersjami, jeśli tylko jeden parametr ma nazwę , parametr jest traktowany jako nazwa tego _ _ parametru w ramach metody anonimowej.

Począwszy od języka C# 9.0, można również użyć modyfikatora w deklaracji static metody anonimowej:

Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4));  // output: 14

Statyczna metoda anonimowa nie może przechwytywać zmiennych lokalnych ani stanu wystąpienia z otaczających zakresów.

Możesz również użyć słowa delegate kluczowego , aby zadeklarować typ delegata.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcję Anonimowe wyrażenia funkcji specyfikacji języka C#.

Zobacz też