Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Operatorn delegate skapar en anonym metod som kan konverteras till en ombudstyp. En anonym metod kan konverteras till typer som och System.Action typer som System.Func<TResult> 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
Anmärkning
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.