Я хотел бы повторить замечание Вилкса о событиях и рекомендовать шаблон проектирования, который поможет решить эту проблему.
Допустим, у вас есть тип, который является источником события, например ::100100
interface IEventSource
{
event EventHandler SomethingHappened;
}
Вот фрагмент класса, который обрабатывает события из экземпляров этого типа. Идея состоит в том, что всякий раз, когда вы назначаете новый экземпляр свойству, вы сначала отписываетесь от любого предыдущего назначения, а затем подписываетесь на новый экземпляр. Нулевые проверки гарантируют правильное поведение границ, и, что более важно, упрощают удаление: все, что вы делаете, - обнуляете свойство.
Что поднимает точку утилизации. Любой класс, подписывающийся на события, должен реализовывать интерфейс IDisposable, поскольку события являются управляемыми ресурсами. (N.B. Для краткости я пропустил правильную реализацию шаблона Dispose в примере, но вы поняли.)
class MyClass : IDisposable
{
IEventSource m_EventSource;
public IEventSource EventSource
{
get { return m_EventSource; }
set
{
if( null != m_EventSource )
{
m_EventSource -= HandleSomethingHappened;
}
m_EventSource = value;
if( null != m_EventSource )
{
m_EventSource += HandleSomethingHappened;
}
}
}
public Dispose()
{
EventSource = null;
}
// ...
}