En multicast delegate är en delegate som har flera metoder kopplade till sig.
När du anropar den, körs alla metoder i ordningen de lades till.
Det funkar bara med delegates som returnerar void – eftersom det inte är tydligt vilket värde som skulle returneras om flera metoder returnerar olika saker.
public delegate void Notify();
public class Program
{
public static void Hello() => Console.WriteLine("Hej!");
public static void Goodbye() => Console.WriteLine("Hejdå!");
public static void Main()
{
Notify notify = Hello;
notify += Goodbye;
notify(); // Skriver ut "Hej!" följt av "Hejdå!"
}
}
notify = Hello; – först pekar delegaten på Hellonotify += Goodbye; – nu pekar den på bådanotify(); – båda metoder körs i tur och ordningDu kan också ta bort en metod:
notify -= Hello;
Du kan skicka en delegate som ett argument till en annan metod. Det ger dig strategi-mönster: du kan byta ut logik vid körning.
public delegate int Operation(int x, int y);
public static int Execute(int x, int y, Operation op)
{
return op(x, y);
}
public static int Add(int a, int b) => a + b;
public static int Multiply(int a, int b) => a * b;
static void Main()
{
Console.WriteLine(Execute(4, 5, Add)); // 9
Console.WriteLine(Execute(4, 5, Multiply)); // 20
}
ExecuteVill du slippa skriva en separat metod? Du kan skicka in en lambda direkt:
Console.WriteLine(Execute(4, 5, (a, b) => a - b)); // 4 - 5 = -1
Eller en anonym metod (äldre syntax):
Console.WriteLine(Execute(4, 5, delegate(int a, int b) {
return a * a + b * b;
}));
LogHandlerLogToConsole och LogToFile (simulera bara LogToFile med en Console.WriteLine)Calculate(int a, int b, Operation op)Calculate med en lambda som dividerar talen, men returnerar 0 om b == 0✔ Multicast delegates – kedja flera metoder
✔ Hur man lägger till och tar bort metoder från en delegate
✔ Hur delegates kan användas som parametrar
✔ Lambda-uttryck och anonyma metoder som kortform