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.