W jednej klasie, ClassA, mam obiekt timera. W tej klasie rejestruję programy obsługi zdarzeń dla zdarzenia, które upłynęło w czasie. W innej klasie, ClassB, mam publiczny event-handler dla upływającego wydarzenia. Więc zarejestrować zdarzeń obsługi z ClassB w ClassA następująco:Co się dzieje, gdy zdarzenie jest uruchamiane i próbuje uruchomić moduł obsługi zdarzeń w obiekcie, który już nie istnieje?
myTimer.Elapsed += ClassBInstance.TimerElapsed
Co się stanie, jeśli były, aby utworzyć nową instancję ClassBInstance a timer, który upłynął pożary zdarzeń, gdy poprzednia instancja event-przewodnika ClassB jest nadal związane z wydarzeniem, które upłynęło w czasie?
Na przykład:
ClassB classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
Rzeczywiście. W szczególności dlatego statyczne zdarzenia są tak niebezpieczne; bardzo łatwo jest utrzymać przy życiu ogromną liczbę przedmiotów, jeśli nie zrezygnujesz z subskrypcji religijnie. Przynajmniej zdarzenia instancji giną wraz z instancją przechowującą pole zaplecza - ale bez GC dla statystyki. –
Warto również wspomnieć o tym, że WPF przeskakuje przez obręcze, aby tego uniknąć dzięki WeakEvents, których IMHO są zbyt skomplikowane i potrzebują wsparcia w zakresie obsługi niektórych języków. – Josh