CSharp

L2 Multicast delegater

🎓 Lektion 2: Multicast Delegates & Delegates som parametrar


🔍 Vad du kommer att lära dig idag:

  • Vad en multicast delegate är
  • Hur man kan kedja flera metoder till en delegate
  • Hur delegates kan användas som parametrar för att skapa flexibel kod

🧠 Vad är en multicast delegate?

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.


🧪 Exempel – Multicast delegate

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å!"
    }
}

🔍 Vad händer här?

  • notify = Hello; – först pekar delegaten på Hello
  • notify += Goodbye; – nu pekar den på båda
  • notify(); – båda metoder körs i tur och ordning

Du kan också ta bort en metod:

notify -= Hello;

🧠 Delegates som parametrar

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.


🧪 Exempel – Strategy Pattern med delegate

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
}

📌 Fördelar:

  • Du kan byta ut metoden utan att skriva om Execute
  • Du får flexibel och återanvändbar kod

🧠 Extra: Anonyma metoder och lambdas

Vill 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;
}));

🛠️ Övningar

✅ 1. Skapa en multicast delegate

  • Skapa en delegate LogHandler
  • Skriv två metoder LogToConsole och LogToFile (simulera bara LogToFile med en Console.WriteLine)
  • Kedja ihop dem till en och anropa

✅ 2. Strategy med lambda

  • Skapa metoden Calculate(int a, int b, Operation op)
  • Anropa Calculate med en lambda som dividerar talen, men returnerar 0 om b == 0

🧠 Reflektion

  • När skulle det vara användbart att köra flera metoder samtidigt?
  • När är det bättre att skicka in en metod som parameter än att hårdkoda den?

✅ Vad du har lärt dig

✔ 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