Events erstellen, auslösen, abarbeiten, entladen (Template ohne delegat)

// Argumente, die beim Auslösen des Events übergeben werden, definieren
public class MyEventArgs : EventArgs
{
    // Rückgabewert des Events (Zugriff mit e.iValue)
    public readonly int iValue;
    
    public MyEventArgs(int val)
    {
        iValue = val;
    }
}

// Klasse, die den Event auslöst
public class MyClass
{
    // Eventhandler
    public event EventHandler<MyEventArgs-> MyEvent;

    public int a;
    public int b;

    public int Calc()
    {
        int iRetVal = a + b;

        // wenn Event abgefragt werden soll
        if (MyEvent != null)
        {
            // Event auslösen
            MyEvent(this, new MyEventArgs(iRetVal);
        }

        return iRetVal;
    }       
}

Anwendungsbeispiel:

// irgendwo im Programm (Formular)
// Objekt der Klasse, die das Event auslöst, definieren
MyClass mc = new MyClass();
// Funktion, die beim Auslösen des Events anspricht, anmelden
mc.MyEvent += new EventHandler<MyEventArgs->(MyCalcEventhandler);
// etwas rechnen und implizit das Event auslösen
mc.a = 5;
mc.b = 7;
mc.Calc();

// Funktion, die beim Auslösen des Events abgearbeitet wird
private void MyCalcEventhandler(object sender, MyEventArgs e)
{
     Console.WriteLine(e.iValue);
     Console.WriteLine(e.iValue);
}

Manchmal kommt es vor, dass man die hinzugefügten Eventhandler auch wieder entfernen will, dazu folgendes erweitertes Anwendungsbeispiel:

// globale Referenz auf den EventHandler anlegen (&quot;Merker&quot;)
private EventHandler<MyEventArgs-> _MyEvent = null;

...

MyClass mc = new MyClass();

// EventHandler erzeugen
_MyEvent = new EventHandler<MyEventArgs->(MyCalcEventhandler);
// EventHandler hinzufügen
mc.MyEvent += _MyEvent;

...

// EventHandler wieder entfernen
mc.MyEvent -= _MyEvent;