ombudsoperator

Operatorn delegate skapar en anonym metod som kan konverteras till en ombudstyp. En anonym metod kan konverteras till typer som och System.Func<TResult> typer som System.Action används som argument till många metoder.

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

Kommentar

Lambda-uttryck ger ett mer kortfattat och uttrycksfullt sätt att skapa en anonym funktion. Använd operatorn => för att konstruera ett lambda-uttryck:

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

Mer information om funktioner i lambda-uttryck, till exempel att samla in yttre variabler, finns i Lambda-uttryck.

När du använder operatorn delegate kan du utelämna parameterlistan. Om du gör det kan den skapade anonyma metoden konverteras till en ombudstyp med valfri lista med parametrar, vilket visas i följande exempel:

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!

Det är den enda funktionen för anonyma metoder som inte stöds av lambda-uttryck. I alla andra fall är ett lambda-uttryck ett föredraget sätt att skriva infogad kod. Du kan använda ignorera för att ange två eller flera indataparametrar för en anonym metod som inte används av metoden:

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

För bakåtkompatibilitet, om endast en enskild parameter heter _, _ behandlas som namnet på parametern i en anonym metod.

Du kan använda static modifieraren i deklarationen av en anonym metod:

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

En statisk anonym metod kan inte samla in lokala variabler eller instanstillstånd från omfång.

Du använder också nyckelordet delegate för att deklarera en ombudstyp.

Från och med C# 11 kan kompilatorn cachelagrat det ombudsobjekt som skapats från en metodgrupp. Tänk på följande metod:

static void StaticFunction() { }

När du tilldelar metodgruppen till ett ombud cachelagrade kompilatorn ombudet:

Action a = StaticFunction;

Innan C# 11 måste du använda ett lambda-uttryck för att återanvända ett enda ombudsobjekt:

Action a = () => StaticFunction();

Språkspecifikation för C#

Mer information finns i avsnittet Anonyma funktionsuttryck i C#-språkspecifikationen.

Se även