So heben Sie die Registrierung eines Ereignishandlers auf

In einer Codeüberprüfung bin ich über dieses (vereinfachte) Codefragment gestolpert, um die Registrierung eines Ereignishandlers aufzuheben:

 Fire -= new MyDelegate(OnFire);

Ich dachte, dass dies die Registrierung des Ereignishandlers nicht aufhebt, da ein neuer Delegat erstellt wird, der zuvor noch nie registriert wurde. Bei der Suche nach MSDN habe ich jedoch mehrere Codebeispiele gefunden, die diese Redewendung verwenden.

So habe ich ein Experiment gestartet:

internal class Program
{
    public delegate void MyDelegate(string msg);
    public static event MyDelegate Fire;

    private static void Main(string[] args)
    {
        Fire += new MyDelegate(OnFire);
        Fire += new MyDelegate(OnFire);
        Fire("Hello 1");
        Fire -= new MyDelegate(OnFire);
        Fire("Hello 2");
        Fire -= new MyDelegate(OnFire);
        Fire("Hello 3");
    }

    private static void OnFire(string msg)
    {
        Console.WriteLine("OnFire: {0}", msg);
    }

}

u meiner Überraschung geschah Folgende

Fire("Hello 1"); hat wie erwartet zwei Nachrichten erzeugt.Fire("Hello 2"); produzierte eine Nachricht!
Dies hat mich überzeugt, dass die Abmeldungnew delegates funktioniert!Fire("Hello 3"); warf einNullReferenceException.
Debugging der Code zeigte, dassFire istnull nachdem die Registrierung des Ereignisses aufgehoben wurde.

Ich weiß, dass der Compiler für Event-Handler und Delegierte viel Code hinter den Kulissen generiert. Aber ich verstehe immer noch nicht, warum meine Überlegungen falsch sind.

Was vermisse ich

Zusätzliche Frage: von der Tatsache, dassFire istnull Wenn keine Ereignisse registriert sind, komme ich zu dem Schluss, dass überall, wo ein Ereignis ausgelöst wird, eine Prüfung gegen @ erfolgnull Wird benötigt

Antworten auf die Frage(4)

Ihre Antwort auf die Frage