delegate – operátor

Operátor delegate vytvoří anonymní metodu, kterou lze převést na typ delegáta. Anonymní metodu lze převést na typy, jako System.Action jsou a System.Func<TResult> typy používané jako argumenty na mnoho metod.

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

Poznámka:

Výrazy lambda poskytují stručnější a výraznější způsob, jak vytvořit anonymní funkci. K vytvoření výrazu lambda použijte operátor =>:

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

Další informace o funkcích výrazů lambda, například zachycení vnějších proměnných, najdete v tématu Výrazy lambda.

Pokud použijete delegate operátor, můžete seznam parametrů vynechat. Pokud to uděláte, lze vytvořenou anonymní metodu převést na typ delegáta s libovolným seznamem parametrů, jak ukazuje následující příklad:

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!

To je jediná funkce anonymních metod, které výrazy lambda nepodporují. Ve všech ostatních případech je výraz lambda upřednostňovaným způsobem psaní vloženého kódu. Pomocí zahození můžete zadat dva nebo více vstupních parametrů anonymní metody, které metoda nepoužívá:

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

Pro zpětnou kompatibilitu, pokud je pojmenován _pouze jeden parametr , _ je považován za název tohoto parametru v rámci anonymní metody.

Modifikátor můžete použít static v deklaraci anonymní metody:

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

Statická anonymní metoda nemůže zachytit místní proměnné ani stav instance z uzavřených oborů.

Pomocí klíčového delegate slova můžete deklarovat typ delegáta.

Počínaje jazykem C# 11 může kompilátor ukládat objekt delegáta vytvořený ze skupiny metod do mezipaměti. Zvažte následující metodu:

static void StaticFunction() { }

Když přiřadíte skupinu metod delegátu, kompilátor uloží delegáta do mezipaměti:

Action a = StaticFunction;

Před jazykem C# 11 byste museli použít výraz lambda k opětovnému použití jednoho objektu delegáta:

Action a = () => StaticFunction();

specifikace jazyka C#

Další informace naleznete v části Anonymní výrazy funkce specifikace jazyka C#.

Viz také