Laden...

Delegate wieder entfernen...

Erstellt von schnecke vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.138 Views
S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren
Delegate wieder entfernen...

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 =)

4.207 Beiträge seit 2003
vor 18 Jahren

Mit dem Gegenstück zu += .... eben -=

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

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?! 🤔

I
111 Beiträge seit 2006
vor 18 Jahren

Du musst das -= auf eine Referanz beziehen:


myClass.OverImageDelegate d=new new myClass.OverImageDelegate(OverImage);
myObject.OverImage += d;
myObject.OverImage -= d;

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

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(

6.862 Beiträge seit 2003
vor 18 Jahren

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.

I
111 Beiträge seit 2006
vor 18 Jahren

@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;

49.485 Beiträge seit 2005
vor 18 Jahren

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

L
667 Beiträge seit 2004
vor 18 Jahren

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

4.221 Beiträge seit 2005
vor 18 Jahren

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...

L
667 Beiträge seit 2004
vor 18 Jahren

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

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.

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

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... 🙂