Hallo,
hier mein Code:
myObject.OverImage += new myClass.OverImageDelegate(OverImage);
... ich hoffe, das war jetzt verständlich... nun möchte ich von myObject das Delegate OverImage wieder entfernen... also quasi das hier machen:
myObject.Remove(OverImage);
... geht so natürlich nicht, aber damit wisst ihr, was ich möchte... also was habe ich zu tun?!
Danke schon mal =)
Mit dem Gegenstück zu += .... eben -=
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Danke für die schnelle Antwort 🙂
Aber irgendwie klappt das so:
myObject.OverImage -= new myClass.OverImageDelegate(OverImage);
nicht...
edit: mit "nicht klappen" meine ich, dass ich dann eine System.Null Exception bekomme, wenn ich den früher vorhandenen Event wieder auslöse... is ja eigentlich auch klar, dass er null ist, denn er ist ja weg... aber das Event wird trotzdem noch ausgelöst... soll es aber nicht... 🙁
... oder habe ich das jetzt missverstanden?! 🤔
Du musst das -= auf eine Referanz beziehen:
myClass.OverImageDelegate d=new new myClass.OverImageDelegate(OverImage);
myObject.OverImage += d;
myObject.OverImage -= d;
Original von IgG
myClass.OverImageDelegate d=new new myClass.OverImageDelegate(OverImage); myObject.OverImage += d; myObject.OverImage -= d;
Aber das += new ... ist in einer anderen Klasse und wird zu einem früheren Zeitpunkt angewandt. Erst im späteren Verlauf des Programms kommt es zu Zuständen, wo sich das Objekt ändert und dann nicht mehr auf das Event reagieren soll....vorher aber schon.
Einfach gesagt: bei Programmstart kann auf alle Bilder in einem Panel ein MouseOver gemacht werden, wird eine Aktion mit einem bestimmten Bild durchgeführt (sagen wir mal n Button gedrückt), dann soll das Bild nicht mehr auf den MouseOver-Event reagieren... ich glaube ich mache es komplizierter als es ist.... X(
Und wieso findet das Entfernen des Delegates in einer anderen Klasse statt? Hört sich für mich spontan alles erstmal nach GUI an und weiß net wie du da getrennt hast.
Baka wa shinanakya naoranai.
Mein XING Profil.
@Schnecke: Wenn das d in einer anderen Klasse ausgeführt wird, kannst du es der ja als Referanz mitgeben und dann am Schluss der Methode wieder mit -= entfernen.
Ich nehme an, der Ereignissender (myObject) wird dem Delegate übergeben, dann kannst dort jja sowas machen wie
((Object)myObject).OverImage -= d;
Hallo schnecke,
fragst du beim Auslösen des Evenst auch, ob dieser null ist? Wenn ja, dann darfst du ihn nicht auslösen, z.B.
protected void OnMyEvent (EventArgs ea)
{
if (MyEvent != null) {
MyEvent (this, ea);
}
}
herbivore
Das event ist immer null, wenn niemand es abonniert hat.
Deshalb ist das schon fast zur Grundregel beim Arbeiten mit events geworden, dass man vor dem Abfeuern des events überprüft, ob es überhaupt Empfänger gibt (denn ansonsten macht schon das Feuern keinen Sinn).
Die Überprüfung macht man so, wie es herbivore schon geschrieben hat, eben mit einer Abfrage auf null. Das sollte man grundsätzlich bei allen Events so machen.
"It is not wise to be wise" - Sun Tzu
Original von Lynix
Deshalb ist das schon fast zur Grundregel beim Arbeiten mit events geworden, dass man vor dem Abfeuern des events überprüft, ob es überhaupt Empfänger gibt (denn ansonsten macht schon das Feuern keinen Sinn).
Das "fast" kannst Du streichen 😉
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Nicht unbedingt, denn es könnte ja auch den Fall geben, dass man explizit eine Exception haben will, falls niemand ein zu feuerndes Event abonniert hat.
D.h. genau dieser Fall könnte auch ein selbst definierter Fehlerfall sein, und dann macht es Sinn, die Null-Abfrage weg zu lassen.
"It is not wise to be wise" - Sun Tzu
Genau andersrum: Ein "geplanter" Fehlerfall ist regulärer Programmfluss und sollte (wenn es geht) nicht mit Exceptions realisiert werden. Daher ist hier eine explizite Nullabfrage sinnvoll. Anders sähe es aus, wenn durch die Programmlogik eine "nicht-belegter" Event eigentlich ausgeschlossen sein sollte. In diesem Falle kann eine Exceptionbehandlung vorgesehen werden um Programmfehler (!) abzufangen.
Original von Lynix
.... eben mit einer Abfrage auf null. Das sollte man grundsätzlich bei allen Events so machen.
Oh... das war mir so nicht bewusst.... bzw. habe ich nicht drüber nachgedacht... und bisher hat klopf auf holz das alles immer so funktioniert.... aber eigentlich ist es ja logisch, dass man auf null prüfen sollte.... 😭
Also vielen Dank für eure Tipps, waren wie immer sehr hilfreich.... und ich habe auch wieder was wichtiges dazu gelernt =)
Und mit dem -= geht jetzt auch wunderbar das (oder heißt es "der") Delegate wieder weg... 🙂