delegate, operator

Operator delegate tworzy metodę anonimową, którą można przekonwertować na typ delegata. Metodę anonimową można przekonwertować na typy, takie jak System.Action i System.Func<TResult> , używane jako argumenty do wielu metod.

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

Uwaga

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 na temat funkcji wyrażeń lambda, na przykład przechwytywania zmiennych zewnętrznych, zobacz Wyrażenia lambda.

Jeśli używasz delegate operatora, możesz pominąć listę parametrów. W takim przypadku można przekonwertować utworzoną metodę anonimową 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. Można użyć odrzucań , aby określić co najmniej dwa parametry wejściowe metody anonimowej, która nie jest używana przez metodę:

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

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

Modyfikator można użyć static w deklaracji 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 ujęć zakresów.

Słowo kluczowe służy delegate również do deklarowania typu delegata.

Począwszy od języka C# 11, kompilator może buforować obiekt delegowany utworzony na podstawie grupy metod. Rozważmy następującą metodę:

static void StaticFunction() { }

Po przypisaniu grupy metod do delegata kompilator buforuje delegata:

Action a = StaticFunction;

Przed użyciem języka C# 11 należy użyć wyrażenia lambda, aby użyć pojedynczego obiektu delegata:

Action a = () => StaticFunction();

specyfikacja języka C#

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

Zobacz też