CSharp

L4 Eventhandler och args

🎓 Lektion 4: EventHandler & EventArgs – Det formella sättet att jobba med events


🔍 Vad du kommer att lära dig:

  • Vad EventHandler och EventHandler<T> är
  • Vad EventArgs är och varför det används
  • Hur du bygger ett “riktigt” event enligt .NET-konvention
  • Hur man skickar med mer information med händelsen

🧠 Varför EventHandler?

Hittills har vi skrivit våra egna delegates för event, t.ex.:

public delegate void TemperatureChanged(int newTemp);

Men i .NET finns en standarddelegate för events som heter EventHandler.
Den har följande signatur:

void EventHandler(object sender, EventArgs e)

Eller generisk variant:

void EventHandler<TEventArgs>(object sender, TEventArgs e)

📦 Vad är EventArgs?

EventArgs är en tom basklass som används som "container" för information. Du kan skapa din egen klass som ärver från EventArgs om du vill skicka med mer data.


🧪 Exempel – EventHandler med EventArgs

public class TemperatureEventArgs : EventArgs
{
    public int Temperature { get; }

    public TemperatureEventArgs(int temperature)
    {
        Temperature = temperature;
    }
}
public class Thermostat
{
    public event EventHandler<TemperatureEventArgs> TemperatureChanged;

    public void SetTemperature(int newTemp)
    {
        Console.WriteLine("Temperatur satt till: " + newTemp);
        TemperatureChanged?.Invoke(this, new TemperatureEventArgs(newTemp));
    }
}
public class Program
{
    static void Main()
    {
        Thermostat t = new Thermostat();
        t.TemperatureChanged += OnTempChanged;

        t.SetTemperature(22);
        t.SetTemperature(30);
    }

    static void OnTempChanged(object sender, TemperatureEventArgs e)
    {
        Console.WriteLine($"[Sensor] Nuvarande temperatur är {e.Temperature}°C");
    }
}

🧠 Fördelar med EventHandler<T>:

  • Standardiserat – lätt att förstå för andra utvecklare
  • Du får med en sender (vem som triggat eventet)
  • Du kan skicka med strukturerad data (TemperatureEventArgs)

🛠️ Övning – Bankkonto med övertrassering

  1. Skapa en klass BankAccount
  2. Lägg till ett event: public event EventHandler<OverdraftEventArgs> Overdrafted;
  3. Skapa OverdraftEventArgs som innehåller belopp och saldo
  4. När saldot går under 0, trigga eventet och visa:
    "⚠️ Övertrassering! Försökte ta ut 500kr. Saldo: -100kr"

📌 Best Practices

  • Namnge event med verb i perfekt particip: SomethingHappened, TemperatureChanged
  • Skicka med this som sender
  • Använd EventArgs.Empty om du inte behöver skicka med data

✅ Vad du har lärt dig

✔ Vad EventHandler och EventHandler<T> är
✔ Hur du skickar med data i ett event via EventArgs
✔ Hur man skriver events på det "officiella" .NET-sättet
✔ Varför detta är bättre än egna delegates i större system