В одном классе ClassA у меня есть объект таймера. В этом классе я регистрирую обработчики событий для прошедшего таймер события. В другом классе ClassB у меня есть открытый обработчик событий для прошедшего таймер события. Поэтому я зарегистрировать событие-обработчик из ClassB в ClassA следующим образом:Что происходит, когда событие срабатывает и пытается выполнить обработчик событий в объекте, который больше не существует?
myTimer.Elapsed += ClassBInstance.TimerElapsed
Что произойдет, если я создать новый экземпляр ClassBInstance и таймер истек пожары событий, когда предыдущий экземпляр обработки события ClassB по-прежнему привязано к истекшему событию таймера?
Например:
ClassB classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
Действительно. В частности, именно поэтому статические события настолько опасны; очень легко сохранить огромное количество объектов в живых, если вы не откажетесь от подписки религиозно. По крайней мере, события экземпляра умирают с экземпляром, который поддерживает поле поддержки, но не GC для статики. –
Также стоит упомянуть, что WPF прыгает через обручи, чтобы избежать этого с WeakEvents, которые IMHO слишком сложны и нуждаются в некоторой языковой поддержке. – Josh