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 Abmeldung
new
delegates funktioniert!Fire("Hello 3");
warf einNullReferenceException
.Debugging der Code zeigte, dass
Fire
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