Mehrfache Zuweisung derselben Event-Handler verhindern
Wenn ich die Zuweisung eines event-handler zur Laufzeit, und es ist in einem Ort, der mehrmals aufgerufen werden kann, was ist die empfohlene Praxis, um zu verhindern, dass mehrere Aufgaben der gleichen handler auf das gleiche Ereignis.
object.Event += MyFunction
Hinzufügen, dass diese in einem Punkt, die aufgerufen wird mehr als einmal ausgeführt wird der handler 'n' - mal (natürlich).
Habe ich gegriffen, um entfernen Sie alle vorherigen handler, bevor Sie versuchen, um über
object.Event -= MyFunction;
object.Event += MyFunction;
Funktioniert es, aber scheint irgendwie aus. Anregungen zum richtigen Umgang mit 😉 dieses Szenario.
InformationsquelleAutor der Frage | 2008-12-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Baget Recht, über die Verwendung einer explizit implementierte event (obwohl es eine Mischung gibt es explizite interface-Implementierung und full-event-syntax). Sie können sich wahrscheinlich Weg mit diesem:
Das möglicherweise etwas seltsam Rand der Fälle, wenn Sie jemals das hinzufügen oder entfernen von multicast-Delegaten, aber das ist unwahrscheinlich. Es muss auch eine sorgfältige Dokumentation, da es nicht die Art und Weise, dass Ereignisse, die normalerweise arbeiten.
InformationsquelleAutor der Antwort Jon Skeet
Ich Neige dazu, fügen Sie einen Ereignishandler in einem Pfad, der einmal ausgeführt wird, beispielsweise im Konstruktor.
InformationsquelleAutor der Antwort ChrisW
Realisieren Sie Ihre eigenen Speicher der delgates, und prüfen Sie die Einzigartigkeit, wenn Sie Sie hinzufügen, um das Ereignis. Sehen EventOwner2 Klasse unten für ein Beispiel. Ich weiß nicht, wie Sie dies tun, performance-Weise, aber dann wieder, das ist nicht immer ein Problem.
InformationsquelleAutor der Antwort Øyvind Skaar
Was ist der access-modifier der "Gegenstand"?
Wenn es privat ist, müssen Sie nur sorgen über das Objekt mit der Einstellung der event-handler.
Wenn es intern ist, müssen Sie nur sorgen über die mit der Montage Einstellung der Ereignis-handler.
Wenn es öffentlich ist, dann ist es weit offen.
Wenn 'Objekt' gemacht werden können private auf der aufnehmenden Klasse, können Sie machen Sie Ihre Prüfungen viel effizienter controlling-event-handler-Zuordnung in der lokalen Klasse.
Wenn 'interne' oder 'public' und die Einzigartigkeit ist eine Anforderung, mit einer wrapper-Klasse, die blendet 'Objekt' und stattdessen stellt eine Methode für die Zuordnung eines event-handler mit Ihren Kontrollen hinter es, um Eindeutigkeit sicherzustellen.
InformationsquelleAutor der Antwort jro